sed:僅搜尋並列印匹配的模式

sed:僅搜尋並列印匹配的模式

從 2 GB 的 Maven 建置日誌檔案中,嘗試擷取異常及其對應的模組。日誌檔案的格式:

[main] [INFO] -------------< org.maven.plugins.junt:parent >-------------
[main] [INFO] Building junt-parent 1.0.0-SNAPSHOT 
...........
...........
...........
........... 
Exception units:
 <failed units>
 <failed units>

提出了以下選項,但兩者都在比賽之前和之後列印附加行。不確定如何向上遍歷並匹配已記錄異常單元的模組。這兩個匹配之間的行不是必需的,只需要異常單元及其失敗的模組。

sed -n '/Exception units/,/^$/p' maven_build.logsed -n '/Building/,/Exception units/!p'

編輯:預期輸出:

Building junt-parent 1.0.0-SNAPSHOT 
Exception units:
 <failed units>
 <failed units>

答案1

從評論中我發現你實際上有一個這樣的文件:

[main] [INFO] Building bar 1.0.0-SNAPSHOT
... Building ........
[main] [INFO] -------------< org.maven.plugins.junt:parent >-------------
[main] [INFO] Building junt-parent 1.0.0-SNAPSHOT 
... Building ........
Exception units:
 <failed units>
 <failed units>

[main] [INFO] Building foo 1.0.0-SNAPSHOT
... Building ........

並且僅當有一行時Exception units:您希望列印這些行直到空行,但在最後[main] [INFO] Building一行之前,這樣您就知道訊息屬於哪個模組。其他[main] [INFO] Building無一例外都不應該列印嗎?

在這種情況下,您可以將每一[main] [INFO] Building行儲存在保留空間中h,以便您可以在需要時呼叫它:

sed -ne '/\[main] \[INFO] Building/h;/Exception units:/{x;p;x;}' -e '//,/^$/p'

如果Exception units:找到該行,則變更空格x,列印儲存的Buildingp並將空格x變更回來。最後,直到空行為止的所有行都被p列印(空模式//與最後一個模式匹配,因此我們不需要重複它)。輸出是:

[main] [INFO] Building junt-parent 1.0.0-SNAPSHOT 
Exception units:
 <failed units>
 <failed units>

如果這不是您想要的,請給出現實世界的例子。

相關內容