過濾匹配字串之間的行

過濾匹配字串之間的行

文件中的內容類似於以下內容 - 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}

    如果當前行包含errorsor warning,則如果變數hdg非空,則列印它。另外,列印當前行。

  • /START/{f=1}

    如果目前行包含START,則將變數設為f1。

多行版本

對於那些喜歡將命令分散在多行中的人:

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

相關內容