複数のプロセスで実行されるサービスがあり、すべてのログが1つの巨大なログを形成します(理由は尋ねないでください)。次のようになります。
process1: bla bla bla
process2: ha ha ha
process3: tarara **error_has_happened**
process3: details of the error here
process1: bla bla bla
process3: more details of the error here
process2: ha ha ha
このエラーはすべてのプロセスで発生する可能性があるため、grepにすべてのプロセスでこのエラーを見つけるようにしたいと思います。
process3: tarara **error_has_happened**
process3: details of the error here
process3: more details of the error here
だから基本的に検出されたエラーが発生しましたそしてそれが起こるプロセスを説明し、そのプロセスから次のN行だけを印刷します。これは、他のプロセスのエラー詳細ログがインターリーブされないと仮定して、このエラーが発生するすべてのプロセスに対して発生する必要があります。
grepだけを使ってこれを行うことはできますか?どのように?
答え1
次のことができます。
grep "error_has_happened" -A3 logfile.log
ここで、3はerror_has_happenedが発生した後に表示される行数です。ただし、ここではエラーを送信したプロセスの出力だけでなく、他のプロセスの出力も表示されます。
クイックテストで私に役立つ詳細なコマンドは次のとおりです。
grep "error_has_happened" logfile.log | cut -d : -f1 | sort -u |
while IFS= read -r process; do
grep "^$process:" logfile.log |
grep -A3 "error_has_happened"
done
答え2
を使用すると、awk
エラー行とプロセスに応じて10行が印刷されます。
awk -F : -v N=10 '/error_has_happened/ {n[$1] = N+1}
n[$1]-- > 0' logfile.log