经常使用awk命令示例汇总

简介

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

经过awk统计最经常使用的命令

下面的命令比较复杂,不过这是一个比较好玩的命令,这条命令能够统计你最经常使用的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》 码农 图灵社区

相关文章
相关标签/搜索