awk:一个基于列的文本处理的工具。awk认为文件是结构化的,即由单词和各种空白字符组成的,空白字符指的是空格,tab,以及连续的空格,tab。每个非空白的部分叫做"域",从左到右依次是第一个域,第二个域等。$1表示第一个域,$0表示全部域。
1.打印指定域
例如打印第一列和第二列:
[root@node1 test]# cat awk.txt
bob 32000 32
lily 12900 23
alice 20000 24 beijing
[root@node1 test]$ awk '{print $1,$2}' awk.txt
bob 32000
lily 12900
alice 20000
例如打印所有列:
[root@node1 test]# awk ‘{print $0}’ awk.txt
bob 32000 32
lily 12900 23
alice 20000 24 beijing
2.指定分隔符
默认情况下是使用空白字符作为分隔符的,也可用-F参数指定分隔符。例如:
[root@node1 test]# awk -F : '{print $1,$3}' /etc/passwd
root 0
bin 1
daemon 2
adm 3
lp 4
sync 5
shutdown 6
halt 7
mail 8
operator 11
games 12
3.内部变量NF,NR
当文件比较大时,每行的列数可能都不一样,可使用内部变量NF查看每行的域的个数。例如:awk.txt的最后一行多一列,因此多一个域
[root@node1 test]# awk '{print NF}' awk.txt
3
3
4
在内部变量NF加一个$,则代表的是最后一列,例如:打印最后一列和倒数第二列
[root@node1 test]# awk '{print $NF}' awk.txt
32
23
beijing
[root@node1 test]# awk '{print $(NF-1)}' awk.txt
32000
12900
24
NR:代表的是这个文本文件的行数,也就是行号。
[root@node1 test]# awk '{print NR}' awk.txt
1
2
3
4.截取字符串
awk可使用substr函数对指定域截取字符串。用法如下:
substr(指定域,开始字符的位置,字符的个数)
若结束的位置为空,则表示到该域的最后一个字符,例如:
[root@node1 test]# awk '{print substr($1,2)}' awk.txt
ob
ily
lice
[root@node1 test]# awk '{print substr($1,2,2)}' awk.txt
ob
il
li
5.确定字符串的长度
可使用内部变量length打印出每行字符串的长度。例如:
[root@node1 test]# awk '{print length}' awk.txt
14
14
22
6.求列和
可以对指定域进行求和。例如:
[root@node1 test]# cat awk.txt
bob 32000 32
lily 12900 23
alice 20000 24 beijing
[root@node1 test]# awk 'BEGIN{total=0}{total+=$3}END{print total}' awk.txt
79
求平均值如下所示:
[root@node1 test]# awk 'BEGIN{total=0}{total+=$3}END{print total/NR}' awk.txt
26.3333
以上介绍的是awk比较简单的用法,感兴趣的还可以再深入研究它的使用方法。