ログファイルからテキストブロックを削除する方法は? [閉鎖]

ログファイルからテキストブロックを削除する方法は? [閉鎖]

次のログがあります。

2016/01/20 00:00:16.035 [T114BaseServlet] ... Blah Blah Blah
2016/01/20 00:00:16.036 [ApplicationState] ... Blah Blah Blah
Blah Blah Blah
Blah Blah Blah
Blah Blah Blah
Blah Blah Blah
2016/01/20 00:00:29.531 [T114BaseRequestPayloadParser] ... Blah Blah Blah
2016/01/20 00:00:36.036 [ApplicationState] ... Blah Blah Blah
Blah Blah Blah
Blah Blah Blah
Blah Blah Blah
Blah Blah Blah

この行を削除したいのですが、ApplicationStateこの行の末尾にパターンはありませんBlah Blah Blah

私が削除したいブロックは次のとおりです。

2016/01/20 00:00:16.036 [ApplicationState] ... Blah Blah Blah
Blah Blah Blah
Blah Blah Blah
Blah Blah Blah
Blah Blah Blah

次の要求が始まる前に。

答え1

一致の前に表示される行を含む、1から始まる行のブロック全体を次の行が表示されるまで削除するには、[T1114Base次のようにします。

sed -e'$!N;/ApplicationState.*\n/,/\n.*\[T1114Base/!P;D' <in >out

これがどのように機能するかを理解するのは非常に簡単です。デフォルトでは、sed入力は一度に1行ずつ食べます。しかし、より広い視点が必要な場合は、スクリプトを書くだけです。

!したがって、入力ラインごとに現在の行が最後の行ではない場合、挿入された改行文字で区切られたパターンスペースに追加の行が$追加されます。sedN\n

範囲式で最初に一致する項目を探します。ApplicationStateその後には*任意の数の.文字が続き、その後には少なくとも1つの行が\n続きます。範囲式を終了するには、$!Nまず目的の入力を調べる必要があります。sed次の行の発生をスキャンします。後ろに最後に削除するアイテムです。\n次の入力ブロックの先頭に一致する必要があるパターンが続くewlineを見つけます。

範囲式が!一致しない場合、パターンスペースから最初の改行文字が印刷さsedれ、一致するかどうかにかかわらず、パターンスペースから最初の改行が削除され、次のようにスクリプトの先頭にリサイクルされます。残り。P\nsedD

sedデフォルトで入力された2行を同時にPスワイプすると、削除ブロックに表示されない場合は最も古い行が印刷され、D拡張を追加する前に常に最も古い行のみが削除されますN

答え2

本当に試してみましたか?

行全体を削除するとします。

sed '/ApplicationState/d' inputfile

関連情報