grep 、sed、awk被称为linux中的"三剑客"。
grep 更适合单纯的查找或匹配文本
sed 更适合编辑匹配到的文本
awk 更适合格式化文本,对文本进行较复杂格式处理
AWK是一种处理文本文件的语言,是一个强大的文本分析工具。

awk基本语法
awk [options] ‘program’ file1 , file2
对于program来说,又可以细分成pattern和action,action指的就是动作,awk最常用的动作就是print和printf。也就是说,awk的基本语法如下:
awk [options] ‘Pattern{Action}’ file

示例一:
不使用[options] ,也不指定pattern,直接使用最简单的action,
Linux 三剑客之awk(一)基础
只使用了一个print 的动作,将aa.txt中的内容全部打印了出来。

看另一个例子:
Linux 三剑客之awk(一)基础
没有使用到options和pattern,awk ‘{print $5}’,表示输出df的信息的第5列,$5表示将当前行按照分隔符分割后的第5列,不指定分隔符时,默认使用空格作为分隔符,上述信息用的空格不止有一个,而是有连续多个空格,awk自动将连续的空格理解为一个分割符了。
awk是逐行处理的,逐行处理的意思就是说,当awk处理一个文本时,会一行一行进行处理,处理完当前行,再处理下一行,awk默认以"换行符"为标记,识别每一行,也就是说,每次遇到"回车换行",就认为是当前行的结束,新的一行的开始,awk会按照用户指定的分割符去分割当前行,如果没有指定分割符,默认使用空格作为分隔符。
Linux 三剑客之awk(一)基础

$0 表示显示整行 ,$NF表示当前行分割后的最后一列($0和$NF均为内置变量)
注意,$NF 和 NF 要表达的意思是不一样的,对于awk来说,$NF表示最后一个字段,NF表示当前行被分隔符切开以后,一共有几个字段。
也就是说,假如一行文本被空格分成了7段,那么NF的值就是7,$NF的值就是$7, 而$7表示当前行的第7个字段,也就是最后一列,那么每行的倒数第二列可以写为$(NF-1)。
我们也可以一次输出多列,使用逗号隔开要输出的多个列,如下,一次性输出第二列和第三列
Linux 三剑客之awk(一)基础
同理,也可以一次性输出多个指定的列,如下图
Linux 三剑客之awk(一)基础
第一行并没有第5列,所以并没有输出任何文本,而第二行有第五列,所以输出了。

除了输出文本中的列,我们还能够添加自己的字段,将自己的字段与文件中的列结合起来,如下做法,都是可以的。
Linux 三剑客之awk(一)基础
从上述实验中可以看出,awk可以灵活的将我们指定的字符与每一列进行拼接,或者把指定的字符当做一个新列插入到原来的列中。

注意,$1这种内置变量的外侧不能加入双引号,否则$1会被当做文本输出,示例如下
Linux 三剑客之awk(一)基础

下面来说一下Pattern,也就是模式。
AWK 包含两种特殊的模式:BEGIN 和 END。
BEGIN 模式指定了处理文本之前需要执行的操作:
END 模式指定了处理完所有行之后所需要执行的操作:
Linux 三剑客之awk(一)基础
上述写法表示,在开始处理aa.txt文件中的文本之前,先执行打印动作,输出的内容为"aaa",“bbb”.
也就是说,虽然指定了test文件作为输入源,但是在开始处理test文本之前,需要先执行BEGIN模式指定的"打印"操作
既然还没有开始逐行处理test文件中的文本,那么是不是根本就不需要指定test文件呢,我们来试试。
Linux 三剑客之awk(一)基础
经过实验发现,我们并没有给定任何输入来源,awk就直接输出信息了,因为,BEGIN模式表示,在处理指定的文本之前,需要先执行BEGIN模式中指定的动作,而上述示例没有给定任何输入源,但是awk还是会先执行BEGIN模式指定的"打印"动作,打印完成后,发现并没有文本可以处理,于是就只完成了"打印 aaa bbb"的操作。
这个时候,如果我们想要awk先执行BEGIN模式指定的动作,再根据执我们自定义的动作去操作文本,该怎么办呢?示例如下
Linux 三剑客之awk(一)基础
红色标注的部分表示BEGIN模式指定的动作,这部分动作需要在处理指定的文本之前执行,所以,上图中先打印出了"aaa bbb",当BEGIN模式对应的动作完成后,在使用后面的动作处理对应的文本,即打印aa.txt文件中的第一列与第二列。

下面来看END模式:
Linux 三剑客之awk(一)基础
END模式就是在处理完所有的指定的文本之后,需要指定的动作。
我们也可以结合BEGIN模式和END模式一起使用。示例如下
Linux 三剑客之awk(一)基础
上述示例中返回的结果有没有很像一张"报表",有"表头" 、“表内容”、 “表尾”。

相关文章: