したがって、次のログサンプルがあります。
2015-03-30 10:19:44,200 DEBUG [Default : 1] [Application:ABC BIW: IDA:6d87de8e-1276-4496-b49d-dd4cd375cbe4 Info:P23 Code:ABCD] A log message 1
2015-03-30 10:19:45,250 DEBUG [Default : 1] [Application:ABC BIW: IDA:6d87de8e-1276-4496-b49d-dd4cd375cbe4 Info:P23 Code:ABCD] A log message 2
2015-03-30 10:19:45,700 DEBUG [Default : 1] [Application:ABC BIW: IDA:6d87de8e-1276-4496-b49d-dd4cd375cbe4 Info:P23 Code:ABCD] log message of exception occurred in
abc.cdef.class.sdk.SampleException: Message exception..
<stacktrace lines goes here>
2015-03-30 10:19:46,100 DEBUG [Default : 1] [Application:ABC BIW: IDA:6d87de8e-1276-4496-b49d-dd4cd375cbe4 Info:P23 Code:ABCD] A log message 3
2015-03-30 10:19:46,120 DEBUG [Default : 1] [Application:ABC BIW: IDA:6d87de8e-1276-4496-b49d-dd4cd375cbe4 Info:P23 Code:ABCD] A log message 4
2015-03-30 10:19:46,120 DEBUG [Default : 1] [Application:ABC BIW: IDA:6d800e80-5276-4006-a44d-dd4cea7bcbe1 Info:P13 Code:AB4D] A log message 6
サーバーに着信する各要求には固有のIDAがあります。特定のIDAを含むすべてのログ行を特定し、見つかったすべてのエントリを別のログファイルに保存したいと思います。 grepを使用する理由は、パターンが見つかったファイルと行番号も追加するためです(grep -n)(検索は2〜3個のファイルで行われます)。しかし、スタックトレース例外も含めたいと思いましたが、その行に私が検索したIDAがなかったため、これは発生しませんでした。
また、以下のように、スタックトレース例外が特定のIDAの最後のエントリの一部として発生する可能性があります。
2015-03-30 10:19:44,200 DEBUG [Default : 1] [Application:ABC BIW: IDA:6d87de8e-1276-4496-b49d-dd4cd375cbe4 Info:P23 Code:ABCD] A log message 1
2015-03-30 10:19:45,200 DEBUG [Default : 1] [Application:ABC BIW: IDA:6d87de8e-1276-4496-b49d-dd4cd375cbe4 Info:P23 Code:BECD] A log message 2
2015-03-30 10:19:44,200 DEBUG [Default : 1] [Application:ABC BIW: IDA:6d87de8e-1276-4496-b49d-dd4cd375cbe4 Info:P23 Code:DFCD] A log message 3
2015-03-30 10:19:45,200 DEBUG [Default : 1] [Application:ABC BIW: IDA:6d87de8e-1276-4496-b49d-dd4cd375cbe4 Info:P23 Code:BBCD] A log message 4
2015-03-30 10:19:45,200 DEBUG [Default : 1] [Application:ABC BIW: IDA:6d87de8e-1276-4496-b49d-dd4cd375cbe4 Info:P23 Code:ABCC] log message of exception occurred in
abc.cdef.class.sdk.SampleException: Message exception..
<stacktrace lines goes here>
2015-03-30 10:19:45,200 DEBUG [Default : 1] [Application:ABC BIW: IDA:ed8ede83-1116-4697-a69d-ee6cd575cbe7 Info:P23 Code:ABDD] A log message 5
これを行うための提案はありますか?
PS1 - あちこちで検索してみましたが、ほとんどのタグの間で検索することがわかりましたが、これは私にとって十分ではありません。
PS2 - 私のソリューションOSは現在1行のgrepですが、Perl、awk、sed、Python、または他の「bashコマンド方式」などの他のソリューションでも開いています。
答え1
Perlソリューション:
perl -ne '$id = "6d87de8e-1276-4496-b49d-dd4cd375cbe4";
print if $match = (/IDA:$id/ .. /IDA:(?!$id)/)
and $match !~ /E0$/
' *.log
説明する:
/regex1/ .. /regex2/
一致する行間の行に対して true を返します。IDA:(?!$id)
私とIDA:
興味がない$ id経由- 範囲の最後の行は
E0
条件チェックのサフィックスとして表示されるため、最後の行(IDAが異なる行)は印刷されません。
ファイル名と行番号を含めるには、次のようにします。
print "$ARGV:$.:$_"
見積もりを完了する前に、以下を追加してください。
; $. = 0 if eof
答え2
これにより、対応するデータ(各行番号の前に来ます)がIDAというファイルに印刷されます。
awk 'match($0,/IDA:[^ ]+/) { print NR, $0 > substr($0,RSTART+4,RLENGTH-4) }' logfile
答え3
Sed
解決策:
sed -n ':2;/IDA:6d87de8/{p;/exception/{:1;n;/IDA:/!{p;b1};b2}}'
このスクリプトは、-n
適切なIDA(/IDA:6d87de8/
)が満たされるまで出力(オプション)を抑制して印刷()しますp
。パターン(行)は「例外」があることを確認し、そうであれば次の行(n
)の実行を開始します。次の行に含まれていない場合は、その行がIDA:
印刷され、スクリプトは次の行に移動します(:1
ポイントで繰り返し)。ラインcosistIDA:
スクリプトが最初から始まる場合(:2
ポイントからループ)
行を列挙するには、nl
またはを介して行を出力し、スクリプトgrep -n ".*"
にパイプします。sed