ログからの複数行のフィルタリング

ログからの複数行のフィルタリング

この質問をstackoverflowに移動する必要がありますか?

Javaアプリケーションによって生成されたログファイルを読み取るには、log4jを使用する必要があることがよくあります。通常、記録されたメッセージ(ログエントリと呼ばれる)は複数行にまたがっています。例:

INFO  10:57:01.123 [Thread-1] [Logger1] This is a multi-line
text, two lines
DEBUG 10:57:01.234 [Thread-1] [Logger2] This entry takes 3 lines
line 2
line 3

各ログエントリは新しい行から始まり、行の最初の単語はTRACE、DEBUG、INFO、またはERRORと少なくとも1つのスペースです。これには2つのログエントリがあります。 1つ目はミリ秒123、もう1つはミリ秒234です。

ログエントリをフィルタリングする(grepは行のみをフィルタリングする)クイックコマンド(sed / grep / awk / etcの組み合わせを使用)が必要です。たとえば、「Logger2」というテキストを含むすべてのログエントリを削除します。

私は次の変換を考えました。

1)同じログエントリに属する​​行を連結するには、特殊文字シーケンスを使用します(例:##)。すべてのログエントリは正確に1行を占めます。

INFO  10:57:01.123 [Thread-1] [Logger1] This is a multi-line##text, two lines
DEBUG 10:57:01.234 [Thread-1] [Logger2] This entry takes 3 lines##line 2##line 3

2)grep
3)行を再分割します(例:##を\ nに置き換えます)。

ステップ1で問題が発生しました。 sedの経験が足りません。

上記のステップ3は必要ないかもしれませんし、sedはすべてのことをするかもしれません。

ベストアンサー1

複数の楽器を混ぜる必要はありません。課題はsed通過のみ可能

sed '/^INFO\|^DEBUG\|^TRACE\|^ERROR/{
         /Logger2/{
             :1
             N
             /\nINFO\|\nDEBUG\|\nTRACE\|\nERROR/!s/\n//
             $!t1
             D     }
                                    }' log.entry

おすすめ記事