從 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.log
也sed -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
,列印儲存的Building
行p
並將空格x
變更回來。最後,直到空行為止的所有行都被p
列印(空模式//
與最後一個模式匹配,因此我們不需要重複它)。輸出是:
[main] [INFO] Building junt-parent 1.0.0-SNAPSHOT
Exception units:
<failed units>
<failed units>
如果這不是您想要的,請給出現實世界的例子。