过滤匹配字符串之间的行

过滤匹配字符串之间的行

文件中的内容类似于以下内容 - START 和 END 之间有很多行,也可能有错误/警告。我想过滤掉 START 和 END 之间的错误/警告行,如果没有则跳过。标题因名称不同而不同。但要制定打印 START 下一行(应该是标题)的逻辑

START
Heading1
.......
errors
........
END

START
Heading2
........
........
........
END

START
Heading3
.......
errors
Warning...
END

预期输出如下

Heading1
errors

Heading3
errors
Warning...

我尝试了以下方法,但这样会打印出 START 和 END 之间的所有内容。我还必须过滤掉错误

awk '/START/,/END/' file

答案1

尝试:

$ awk 'f{hdg=$0; f=0} /errors|warning/{if(hdg){print hdg; hdg=""}; print} /START/{f=1}' file
Heading1
errors
Heading3
errors

怎么运行的

  • f{hdg=$0; f=0}

    如果f为真(非零),则将当前行保存在变量中hdg并将其设置f回零。

  • /errors|warning/{if(hdg){print hdg; hdg=""}; print}

    如果当前行包含errorswarning,则如果变量hdg非空,则打印它。此外,打印当前行。

  • /START/{f=1}

    如果当前行包含START,则将变量设置f为一。

多行版本

对于那些喜欢将命令分布在多行上的人来说:

awk '
   f {
      hdg=$0
      f=0
   }
   /errors|warning/{
      if(hdg){
         print hdg
         hdg=""
      }
      print
   }
   /START/{
      f=1
   }' file

变化:在标题前添加一个空行

如果我们想要一个空行来分隔输出:

$ awk 'f{hdg=$0; f=0} /errors|warning/{if(hdg){print nl hdg; hdg=""; nl="\n"}; print} /START/{f=1}' file
Heading1
errors

Heading3
errors

变化:忽略 END 行之后的错误/警告

$ awk 'f{hdg=$0; f=0} g && /errors|warning/{if(hdg){print nl hdg; hdg=""; nl="\n"}; print} /START/{f=1; g=1} /END/{g=0}' file
Heading1
errors

Heading3
errors

为了使上述内容不区分大小写(GNU awk):

awk 'BEGIN{IGNORECASE=1} f{hdg=$0; f=0} g && /errors|warning/{if(hdg){print nl hdg; hdg=""; nl="\n"}; print} /START/{f=1; g=1} /END/{g=0}' file

相关内容