awk是一个强大的文本处理工具,它主要是针对文本列来进行处理。awk的语法比较复杂,下面经过总结经常使用的例子来方便平常的工做使用。python
首先使用你喜好的文本编辑器建立包含下面内容的文件,这个文件将在下面使用到,最后文件名称保存为Awk.txt。linux
$ cat Awk.txt Line1 john.wang Male 30 021-11111111 Line2 lucy.yang Female 25 021-22222222 Line3 jack.chen Male 35 021-33333333 Line4 lily.gong Female 21 021-44444444 shanghai
awk默认是用空格和tab符来分割的,连续的空格和tab也能够,例如,一个空格和一个tab符也默认看成一个分隔符来处理。 经过下面方法,来使用冒号“:”和“.”来分割。git
$ echo '1:2:3' | awk -F : '{ print $1, $2, $3, $1+$2+$3 }' #指定使用‘:’冒号分隔 1 2 3 6 $ cat Awk.txt | awk -F . '{ print $1, $2 }' #指定使用‘.’英文句号分隔 Line1 john wang Male 30 021-11111111 Line2 lucy yang Female 25 021-22222222 Line3 jack chen Male 35 021-33333333 Line4 lily gong Female 21 021-44444444 shanghai
能够经过awk来对列进行过滤,打印显示特定的列,其中变量NF是总列数。编辑器
$ cat Awk.txt | awk '{ print $2, $4 }' #打印姓名和年龄两列 john.wang 30 lucy.yang 25 jack.chen 35 lily.gong 21 $ awk '{ print $2, $4 }' Awk.txt #和上面命令结果同样,只是没有使用管道 $ cat Awk.txt | awk '{ print $NF }' #打印最后一列 021-11111111 021-22222222 021-33333333 shanghai $ cat Awk.txt | awk '{ print $(NF-1) }' #打印倒数第二列 30 25 35 021-44444444
awk命令和实现head和tail已经sed等工具相似的功能来对文本的行进行过滤,显示特定的行。工具
若是你对过滤特定的行有兴趣,能够看一下我写的《利用linux命令行工具进行文本行过滤》 接下来利用awk来显示特定的文本行,NR表明行号:.net
$ awk 'NR<=3' Awk.txt #显示前3行 Line1 john.wang Male 30 021-11111111 Line2 lucy.yang Female 25 021-22222222 Line3 jack.chen Male 35 021-33333333 $ awk '(NR>=2)&&(NR<=3)' Awk.txt #显示第2和3行 Line2 lucy.yang Female 25 021-22222222 Line3 jack.chen Male 35 021-33333333
使用下面方法来对特定的列进行求和命令行
$ seq 10 | awk '{ sum += $1} END { print sum }' #计算1到10的累加 55 $ cat Awk.txt | awk '{ sum += $4} END { print sum/NR }' #对第4列求和并计算平均年龄 27.75
下面的命令比较复杂,不过这是一个比较好玩的命令,这条命令能够统计你最经常使用的10条命令。code
$ history | awk '{CMD[$2]++; count++;} END{ for (a in CMD) print CMD[a]" "CMD[a]/count*100"%" , a}' | > grep -v "./" | column -c 3 -s " " -t | sort -nr | nl | head -n 10 1 1037 13.4344% ls 2 808 10.4677% fg 3 657 8.51147% cd 4 639 8.27827% python3 5 316 4.09379% adb 6 291 3.76992% echo 7 283 3.66628% git 8 248 3.21285% ll 9 243 3.14808% sudo 10 218 2.8242% vi
awk其实也能够算作是一种脚本语言,可是它和如今流行的python语言相比,语法不够简洁。并且awk也是比较古老的工具了,例如上面最后统计经常使用命令的例子,彻底能够用python脚原本实现。固然python脚本代码的行数就要比awk多,可是代码的可读性更好。因此awk仍是适合较小的任务,而python能够完成更加复杂的工做。blog
《Linux系统命令及Shell脚本实践指南》 王军著get
《鸟哥的Linux私房菜》 鸟哥著
《码农增刊 Linus与Linux》 码农 图灵社区