linux三剑客awk命令详解之模式(pattern)

awk命令的使用语法
awk [options] ‘{pattern + action}’ {filenames}

在之前的awk命令详解一中,笔者已经使用过BEGIN模式和END模式。现在来主要介绍awk命令中的模式。

默认的情况下,awk是逐行处理文本的,也就是先处理完当前行,再处理下一行,这种默认的情况也被称为空模式。而若指定了“条件”,awk命令在处理文本时,只有满足”条件“的行才会被处理,不满足”条件“的行就不会被处理。这其实就是awk命令的模式pattern。

awk命令模式

awk命令主要有以下几种模式:

  • 空模式
    即不指定匹配条件,默认一行一行处理文本内容。

  • BEGIN模式
    即在开始处理文本之前,需要执行的操作,比如打印表头;

  • END模式
    即在文本中的所有行都处理完成后,需要执行的操作;

  • 关系运算模式
    即在指定条件时,使用关系操作符,示例如下:
    linux三剑客awk命令详解之模式(pattern)
    命令只打印了满足条件(通过分割后,行数为4列)的行。
    下面列出了awk支持的关系操作符:
    linux三剑客awk命令详解之模式(pattern)

  • 正则模式
    即把正则表达式当作条件,能与正则表达式匹配的行即满足条件。
    示例如下:
    linux三剑客awk命令详解之模式(pattern)
    awk命令在使用正则表达式作为条件时,将正则表达式放入了’/ /‘中,如上图的命令的正则表达式^sello,该命令的功能是将文件中以sello开头的行打印输出。
    ⚠️
    1)awk命令中的正则表达式与grep命令中的扩展正则表达式语法一致,
    2)当正则表达式中包含"/"时,需要进行转义,不然会与awk命令中表示正则表达式的规则部分的’/ /'产生冲突,示例如下:
    linux三剑客awk命令详解之模式(pattern)
    上图未使用转义,命令出现报错。
    linux三剑客awk命令详解之模式(pattern)
    将"/"进行转义后,正确实现了功能。

  • 范围模式
    范围模式处理的原则是:先匹配从第一个模式的首次出现到第二个模式的首次出现之间的内容,执行action。然后匹配从第一个模式的下一次出现到第二个模式的下一次出现,直到文本结束。如果匹配到第一个模式而没有匹配到第二个模式,则awk处理从第一个模式开始直到文本结束全部的行。若第一个模式不匹配,就算第二个模式匹配,awk不处理任何行。
    示例如下:
    图片中,蓝色的表示第一个模式,红色的表示第二个模式。linux三剑客awk命令详解之模式(pattern)
    linux三剑客awk命令详解之模式(pattern)
    linux三剑客awk命令详解之模式(pattern)
    图中3和13都是第一个模式能匹配到的内容,7是第二个模式匹配到的内容,13是匹配到的第一个模式,但直到结尾都没有匹配到与其对应的第二个模式,所以执行到结尾。
    linux三剑客awk命令详解之模式(pattern)
    图中没有任何输出结果,表明没有匹配到任何行。

以下是处理文本的示例:
linux三剑客awk命令详解之模式(pattern)
图中命令的功能是打印输出以行中出现apple的行为开始到以行中出现pupple的行为结束的所有行。
linux三剑客awk命令详解之模式(pattern)
图中命令的第一个模式匹配到两次,并且,第一个模式在第二次匹配的时候已经达到了文本的末尾,所以打印输出到文件的末尾。
linux三剑客awk命令详解之模式(pattern)
图中命令的第一个模式是/.*readhat/,而文本中没有这个模式,尽管第二个模式能够匹配到,只要第一个模式没有匹配,就不会有匹配结果。

当然,如果确定了打印输出哪几行,可以借助关系操作符模式和awk的内置变量,示例如下:
linux三剑客awk命令详解之模式(pattern)
命令直接打印输出文本中的第1行到第3行的内容。