![過濾匹配字串之間的行](https://rvso.com/image/913171/%E9%81%8E%E6%BF%BE%E5%8C%B9%E9%85%8D%E5%AD%97%E4%B8%B2%E4%B9%8B%E9%96%93%E7%9A%84%E8%A1%8C.png)
文件中的內容類似於以下內容 - 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}
如果當前行包含
errors
orwarning
,則如果變數hdg
非空,則列印它。另外,列印當前行。/START/{f=1}
如果目前行包含
START
,則將變數設為f
1。
多行版本
對於那些喜歡將命令分散在多行中的人:
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