刚刚开始学习linux学到awk命令自己也上机实验了一下在网上看到老男孩老师的一篇文章感觉非常棒(文章贴在后边)在结合自己的体会写出来供大家参考:
1、awk的运行原理我自己的理解:如下图
awk使用的一点体会_第1张图片
2、重要参数和举例说明:
例如:假设我们有个文件内容如下
1 2 3 4 5
A 11 22 ; 77
B 33 44 88 99
C 55 ; 66 100
参数1:可以打印出目前处理的行和列数(NF和NR)
[root@MY-LINEX-TEST1 ~]# awk '{print NF"\t"NR}' /data/a.txt
5 1
5 2
5 3
5 4
可以看出就是一行一行的处理的而且还打印除了列数和行号在改一下吧,看着不清楚
[root@MY-LINEX-TEST1 ~]# awk '{print "clum:="NF"\t""line="NR}' /data/a.txt
clum:=5 line=1
clum:=5 line=2
clum:=5 line=3
clum:=5 line=4
参数2:指定分隔符-F用这个参数可以指定分隔符是什么,默认情况下是空格
[root@MY-LINEX-TEST1 ~]# awk -F";" 'NR==2 {print $2 }' /data/a.txt
77
可以看出上面的语句是以";"为分割符打印出第二行的第二列
注意:(非常重要)
这个-F参数有一个特别重要的功能就是可以指定多个分隔符就用oldboy老师的那个例子来说明问题
[root@MY-LINEX-TEST1 ~]# echo ----1:2----:3|awk -F '[-:]+' '{print $3}'
2

因为第一列是空格因此$3才会输出2;
参数3:用printf来指定格式输出,例如我们用用户名文件/etc/passwd为例来说明
[root@MY-LINEX-TEST1 ~]# awk -F ':' 'NR>8&&NR<20 {print $1"\t"$5}' /etc/passwd 

mail mail
uucp uucp
operator operator
games games
gopher gopher
ftp FTP User
nobody Nobody
dbus System message bus
vcsa virtual console memory owner
abrt
haldaemon HAL daemon
看着不是很对齐这情况我就可以用printf来设定格式了和C语言基本一样就是
[root@MY-LINEX-TEST1 ~]# awk -F ':' 'NR>8&&NR<20 {printf"%10s %10s\n", $1,$5}' /etc/passwd
mail mail
uucp uucp
operator operator
games games
gopher gopher
ftp FTP User
nobody Nobody
dbus System message bus
vcsa virtual console memory owner
abrt
haldaemon HAL daemon
这里不要忘记反斜杠n不然更乱。
其他的功能我就还不是很清楚以后在慢慢请了在补充进来。
oldboy文章:https://blog.51cto.com/oldboy/950730