2

次のようなログ ファイルがあります。

11-Sep-2012 00:00:00 clojure.contrib.logging$fn__43$impl_write_BANG___51 invoke
INFO: creditAcc(args=[1506112834429596390 7080851004 4500])
11-Sep-2012 00:00:00 clojure.contrib.logging$fn__43$impl_write_BANG___51 invoke
INFO: callProf|tupsCredit|180|[1506112834429596390 7080851004 45]
11-Sep-2012 00:00:00 clojure.contrib.logging$fn__43$impl_write_BANG___51 invoke
INFO: creditAcc(args=[1506112834429596390 7080851004 4500]) -> done.
11-Sep-2012 00:00:00 clojure.contrib.logging$fn__43$impl_write_BANG___51 invoke
INFO: return(1506112834429596390,0)

ログ ファイルの各エントリは 2 行にわたるため、各エントリはタイムスタンプで始まります。sed を使用して最初の行の末尾にある改行文字を置き換えることができましたが、問題は、ログ エントリの途中に Java スタック トレース メッセージがあることです。sed がスタック トレースを通過すると、エントリの順序が逆になり、INFO または ERROR などで始まり、タイムスタンプが 2 行目に表示されます。したがって、正規表現 [^\d{2}] のようなものを使用して sed にタイムスタンプを最初の行として認識させ、同じ行で改行文字をスペースに置き換えてから値を分割するソリューションを探していました分析用の列。スタックトレース メッセージは空白 [^\s] で始まるため、簡単に識別してスキップできます。

sed または awk を使用してこれを解決する最善の方法は何ですか?

4

1 に答える 1

2
sed '/^ /d; N; s/\n/ /' inputfile

これは、スペースで始まる行と一致し、それらを削除します。命令は残りのd命令をスキップします。行がスペースで始まらない場合は、次の行も読み込まれ、それらの間の改行がスペースに変更されます。

ログ行がペアになっている場合にのみ正しく機能します。つまり、スタックトレース行がタイムスタンプ行の後にあり、スタックトレースの後にINFO / ERROR行が表示されている場合、正しく機能しません。

于 2012-09-12T11:01:49.677 に答える