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>

以下のオプションを試しましたが、どちらも一致の前後に追加の行が出力されます。例外ユニットがログに記録されたモジュールをトラバースして一致させる方法がわかりません。これら 2 つの一致の間の行は不要で、例外ユニットとその失敗したモジュールだけが必要です。

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>

これが望ましくない場合は、実際の例を挙げてください。

関連情報