原创:花括号MC(微信公众号:huakuohao-mc)。关注JAVA基础编程及大数据,注重经验分享及我的成长。javascript
AWK
诞生于1977的贝尔实验室,是由 Alfred Aho,Peter Weinberger和Brian Kernighan三位大神开发,AWK
的命名是由三位做者的Family Name的首字母组成。java
三位大神开发AWK
的初衷是为了方便快速的处理文本及数据信息,在当年那个即没有python
也没有go
的年代,这是一个很酷也颇有意义的事情;不过话说回来,即使是如今有了Python
跟Go
,AWK
在平常线上运维方面仍然占据一席之地,并且几乎不可替代。python
若是你对AWK
仍是不甚了解,那么但愿经过这篇博文,可以让各位作个简单入门,若是这篇文章还能提起你学习AWK
的兴趣就更好了。程序员
AWK
的程序通常都很短,但并非说AWK
写不出逻辑复杂的程序。AWK
像你学过的其它语言同样,支持变量自定义,数组结构,for
循环等等,同时也支持自定义函数。正则表达式
假设咱们打算处理一个在线商店的后台日志,内容以下:shell
python基础教程 山治 34.50 5
python高级教程 索隆 40.00 6
python实战 娜美 38 3
java编程思想 弗兰克 48.00 6
Vue教程 javascript小组 55.00 8
awk基础教程 路飞 42 3
复制代码
第一列为书名,第二列为做者,第三列为价格,第四列为当日销售数量。咱们将该文件命名为awk_books.log
。接下来咱们将经过一些实际的案例需求来学习AWK
编程
找出价格大于40的书籍数组
awk '$3>40 {print $0}' awk_books.log
复制代码
输出:bash
$ awk '$3>40 {print $0}' awk_books.log
java编程思想 弗兰克 48.00 6
Vue教程 javascript小组 55.00 8
awk基础教程 路飞 42 3
复制代码
解释微信
awk
的意思是告诉操做系统我要执行awk
程序,请作好准备。单引号里面的内容为具体的程序逻辑。awk_books.log
为要处理的文件。
写awk
的程序其实很简单,由于是有固定套路的。套路就是 'pattern {action}'
,pattern
称为模式,action
称为动做。
awk
会自动读入要处理文件的每一行内容,依次用pattern
去匹配,若是匹配成功,则执行action
。对于上面的例子,pattern
为$3>40
,action
为{print $0}
。
注意:
pattern
跟action
没必要同时存在,后面我会有例子给你们解释什么意思。
到此为止,对于上面的小例子,除了$3
和$0
你还不理解之外,其它应该都了解了。
awk
会将输入的每一行按照空白字符进行分隔,所以分隔以后的第一列就是$1
,第二列就是$2
,以此类推,咱们的例子中书价在第三列,天然就是$3
,变量$0
则表明整行记录。
若是要处理的文本内容不是按照空白字符分隔怎么办?你能够这样处理。
echo "hello-world" | awk 'BEGIN{FS="-"} {print $1}'
复制代码
输出的结果都为hello
FS
为awk
的内置变量,表示输入列的分隔符,默认为空白符。上面的例子中咱们将FS
的默认值设置成咱们但愿的样子,也就是-
。除了FS
之外,跟分隔符相关的内置变量还有输出列分隔符OFS
,输入行分隔符RS
,输出行分隔符ORS
。我就不依依举例展现了。
BEGIN
表示的意思是AWK
程序开始执行以前执行BEGIN
关键字以后的语句,并且只执行一次,因此常常用来初始化变量或者文件头。除了BEGIN
,还有END
,我后面还会有样列介绍,你们不要着急。
好了,这里先作个简单的小结,而后继续出发。 1.咱们知道了如何在命令行终端调用AWK
程序。 2.知道了AWK
程序的固定套路为 'pattern {action}'
格式 3.了解了内置变量$0
,$1
,以及FS
的做用。
接下来经过一些具体的样例继续学习。
打印出每一行最后一列
awk '{print $NF}' awk_books.log
复制代码
输出结果:
$ awk '{print $NF}' awk_books.log
5
6
3
6
8
3
复制代码
这个例子中,明显没有pattern
而只有action
。AWK
中若是没有pattern
,则默认匹配全部行。而NF
为AWK
的内置变量,表示每一行有多少列。因此$NF
天然就表明着最后一列的输出内容。基于这个例子,你能够尝试着打印出每一行的倒数第二列内容,代码以下:
awk '{print $(NF-1) }' awk_books.log
复制代码
只打印出第二行内容
awk 'NR == 2' awk_books.log
复制代码
输出结果:
$ awk 'NR == 2' awk_books.log
python高级教程 索隆 40.00 6
复制代码
这个例子明显没有action
只有pattern
,若是没有写action
则执行默认action
,默认的action
就是打印匹配的行内容。NR
也是内置变量,表示AWK
已经读取的行数。
打印每一行的内容及行号
awk '{print NR,$0}' awk_books.log
复制代码
输出结果:
$ awk '{print NR,$0}' awk_books.log
1 python基础教程 山治 34.50 5
2 python高级教程 索隆 40.00 6
3 python实战 娜美 38 3
4 java编程思想 弗兰克 48.00 6
5 Vue教程 javascript小组 55.00 8
6 awk基础教程 路飞 42 3
复制代码
print
里面用逗号分隔要打印的多个内容,输出的时候逗号会被空格替代。
更好的输出
接上面的例子,咱们让输出结果更易读一些。
awk 'BEGIN{print"编号 书名 做者 价格 销量"; print""} {print NR,$0} END{print"";print "输出结束!"}' awk_books.log
复制代码
输出结果
$ awk 'BEGIN{print"编号 书名 做者 价格 销量"; print""} {print NR,$0} END{print"";print "输出结束!"}' awk_books.log
编号 书名 做者 价格 销量
1 python基础教程 山治 34.50 5
2 python高级教程 索隆 40.00 6
3 python实战 娜美 38 3
4 java编程思想 弗兰克 48.00 6
5 Vue教程 javascript小组 55.00 8
6 awk基础教程 路飞 42 3
输出结束!
复制代码
BEGIN
,在前面已经提到了过了,这里是为了加深一下你们的理解。BEGIN
和END
后面跟随的语句都只执行一次,即在程序的开头和结束。
打印包含Java的行
awk '/java/ {print $0}' awk_books.log
复制代码
输出结果:
$ awk '/java/ {print $0}' awk_books.log
java编程思想 弗兰克 48.00 6
Vue教程 javascript小组 55.00 8
复制代码
这个样例的匹配模式是个正则表达式,只要有匹配的内容就会输出对应的行。你能够根据业务需求写出更复杂的正则表达式。
打印第一列包含java的行
awk '$1 ~/java/ {print $0}' awk_books.log
复制代码
输出结果:
$ awk '$1 ~/java/ {print $0}' awk_books.log
java编程思想 弗兰克 48.00 6
复制代码
打印第一列不包含Java的行
awk '$1 !~/java/ {print $0}' awk_books.log
复制代码
输出结果:
$ awk '$1 !~/java/ {print $0}' awk_books.log
python基础教程 山治 34.50 5
python高级教程 索隆 40.00 6
python实战 娜美 38 3
Vue教程 javascript小组 55.00 8
awk基础教程 路飞 42 3
复制代码
统计输入文本的总行数
awk 'END {print NR}' awk_books.log
复制代码
输出结果:
$ awk 'END {print NR}' awk_books.log
6
复制代码
输出字符数超过33的行
awk 'length($0)> 33' awk_books.log
复制代码
输出结果:
$ awk 'length($0)> 33' awk_books.log
java编程思想 弗兰克 48.00 6
Vue教程 javascript小组 55.00 8
复制代码
length
为内置函数,此外还有不少内置函数,不在此一一列举了,感兴趣的能够去查。
输出价格最高的行
awk '$3>max {max = $3; maxline=$0} END {print max,maxline}' awk_books.log
复制代码
输出结果:
$ awk '$3>max {max = $3; maxline=$0} END {print max,maxline}' awk_books.log
55.00 Vue教程 javascript小组 55.00 8
复制代码
这里max
及maxline
为自定义变量,AWK
里面的变量不用事先声明,直接用就OK,默认值为空或者0。
计算当天销售总价并输出
awk '{total += $3*$4} END { print total}' awk_books.log
复制代码
输出结果:
$ awk '{total += $3*$4} END { print total}' awk_books.log
1380.5
复制代码
找出全部Python的书目,而后按照价格排序
awk '$1 ~/python/ {print $0}' awk_books.log|sort -n -k 3 -t ' '
复制代码
输出结果:
$ awk '$1 ~/python/ {print $0}' awk_books.log|sort -n -k 3 -t ' '
python基础教程 山治 34.50 5
python实战 娜美 38 3
python高级教程 索隆 40.00 6
复制代码
找出全部Python的书目,按照价格排序,并输出价格最高的两条
awk '$1 ~/python/ {print $0}' awk_books.log|sort -r -n -k 3 -t ' '|head -n 2
复制代码
输出结果:
$ awk '$1 ~/python/ {print $0}' awk_books.log|sort -r -n -k 3 -t ' '|head -n 2
python高级教程 索隆 40.00 6
python实战 娜美 38 3
复制代码
最后两个列子借住了sort
和head
,不了解两个指令的能够去查一下,这里不作过多的介绍了。
好了,以上这些AWK
知识应该够各位应付平常的工做需求了。若是还不够怎么办呢?去买两本书,继续深刻学啊!
推荐阅读:
·END·
Java·大数据·我的成长