これが私の要求です。
ログファイルをたどってgrepingしています。
各grep結果のコンテキストを取得したいと思います。
ただし、コンテキストはgrep -A/-B/-C
提供される行数の代わりに「パターンが一致するまで」でなければなりません。
たとえば、
これが私のログであるとします。
[l]
各ログ行のプレフィックスです。また、[logTypeA]
プレフィックスまたはプレフィックスもあります。[logTypeB]
[l][logTypeA] - Log line 1
[l][logTypeB] - Log line 2
[l][logTypeA] - Log line 3
....
Random data about Log line 3
....
[l][logTypeB] - Log line 4
今私のtail
コマンドがあれば、tail -f log_file.log | grep "[logTypeA]"
出力が表示されます。
[l][logTypeA] - Log line 1
[l][logTypeA] - Log line 3
ただし、grep結果のコンテキスト情報が必要であり、そのコンテキストはいくつかの行ではなく特定のパターンが一致するまで(この場合は[l])。
この例では、grepの結果を次のように作成したいと思います。
[l][logTypeA] - Log line 1
[l][logTypeA] - Log line 3
....
Random data about Log line 3
....
ここから(別の特定の一致まで、各grep一致の後に行を表示するには?sed
)、次のコマンドを試しました。tail
tail -f log_file.log | sed '/\[logTypeA\]/,/\[l\]/p'
しかし、これはうまくいかないようです。
どんなアイデアがありますか?
ベストアンサー1
これはAwkで非常に一般的なパターンです。関連行を集めて「レコード」にし、すべてのレコードを収集し、特定の条件が満たされるとレコードを印刷します。
tail -f file |
awk '/\[l]/ { if (p && stored) print stored; stored = ""; p=0 }
/\[logTypeA]/ { p=1 }
{ stored = stored (stored ? ORS : "") $0 }
END { if (p) print stored }'
END
無限のストリームの場合、条件は実際には意味がありませんが、テストtail -f
中の最後のレコードを印刷する必要があるときに良い測定と厄介なテストの失敗を避けるために条件を含めましたが、このEND
規定なしには含めませんでした。