awk是什么?awk是一个**报表生成器**,拥有强大的文本格式化的能力。我们可以利用awk来处理文本,整理成各种“表”的样子。
awk 是由 Alfred Aho 、Peter Weinberger 和 Brian Kernighan 三个创造者的姓氏的首个字母组成,早期应用于Unix上,所以我们现在使用的Linux版的awk其实是gawk,也就是GNU awk。
awk其实是一门脚本语言,它支持条件判断、数组、循环等功能
事实上,grep 、sed、awk 被称为 linux 中的 "三剑客"。
* grep 适合单纯的查找或匹配文本
* sed 适合编辑匹配到的文本
* awk 适合格式化文本,对文本进行较复杂格式处理
## awk基础
awk的基本语法如下,
~~~
awk [options] 'program' file1 , file2 , ……
~~~
其中program也可以细分为pattern和action,也就是说
~~~
awk [options] 'Pattern{Action}' file
~~~
action 指的就是动作,awk 擅长文本格式化,并且将格式化以后的文本输出,所以 awk 最常用的动作就是 print 和 printf
比如testd文件中含有"ddd"三个字符
那么使用`awk '{print}' testd`,就会返回`ddd`
下面我们可以看另一个场景:
![](https://raw.githubusercontent.com/dy2903/gallery/master/20181115093024.png)
其中`awk '{print $5}'`表示输出df信息的第5列,$5表示将当前行按照**分隔符**分隔后的第5列,默认指定空格为分隔符。
另外awk自动将**连续的**空格理解为一个分隔符。
awk是逐行处理的,也就是当awk处理一个文本的时候,会一行一行的处理,默认以“换行符”为标记。
![](https://raw.githubusercontent.com/dy2903/gallery/master/20181115093231.png)
> $0表示显示整行,$NF表示当前行分割后的最后一列,NF表示当前行被分割开以后,一共有几个字段。也就是说,如果一行文本给空格分成了7段,那么NF的值就是7,$NF的值就是$7,而$7表示当前行的第7个字段,也就是最后一列,那么倒数第二列就是$(NF-1)
我们也可以一次输出多列,使用**逗号**进行隔开
~~~
awk '{print $1,$2}' test
~~~
如果某一行没有第2列,则第2列不会有输出。
除了输出文本的列,我们还可以添加的字段,与文件中的列结合起来。
![](https://raw.githubusercontent.com/dy2903/gallery/master/20181115093453.png)
## Pattern
之前介绍了最常用的Action,也就是print。
下面我们来介绍一下Pattern,也就是模式。
AWK 包含两种特殊的模式:BEGIN 和 END。
* BEGIN 模式:指定了处理文本之**前**需要执行的操作:
* END 模式:指定了处理完所有行之**后**所需要执行的操作:
![](http://p8a6vmhkm.bkt.clouddn.com/picgo20180919140934.png?picgo)
也就是表示在处理test文件之前,先执行打印动作。既然还没开始处理test中的文本,也可以不指定test文件
如果我们想awk先执行BEGIN指定的动作,然后再根据我们自定义的动作去操作文本,
![](http://p8a6vmhkm.bkt.clouddn.com/picgo20180919141114.png?picgo)
上图中先打印出了 "aaa bbb",当 BEGIN 模式对应的动作完成后,在使用后面的动作处理对应的文本,即打印 test 文件中的第一列与第二列