您的位置:首页 > 其它

常用awk命令示例汇总

2017-04-12 00:00 330 查看
摘要: 常用的awk命令例子

简介

awk是一个强大的文本处理工具,它主要是针对文本列来进行处理。awk的语法比较复杂,下面通过总结常用的例子来方便日常的工作使用。

常见用法示例

准备工作

首先使用你喜爱的文本编辑器创建包含下面内容的文件,这个文件将在下面使用到,最后文件名称保存为Awk.txt。

$ 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符也默认当作一个分隔符来处理。
通过下面方法,来使用冒号“:”和“.”来分割。

$ 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代表行号:

$ 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

通过awk统计最常用的命令

下面的命令比较复杂,不过这是一个比较好玩的命令,这条命令可以统计你最常用的10条命令。

$ 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可以完成更加复杂的工作。

参考文献:

《Linux系统命令及Shell脚本实践指南》 王军著

《鸟哥的Linux私房菜》 鸟哥著

《码农增刊 Linus与Linux》 码农 图灵社区
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: