ログファイルを分割し、その分割部分でエラーを検索します。エラーがある場合は、関連するログファイル部分を別のファイルに格納します。
ちょっとした例:
ログファイルは次のようになります:
STARTLOG1
blabla
more_blabla
ENDLOG1
STARTLOG2
エラー: Errortextこれは ユーザー XYZ からの
エラーです ENDLOG2 STARTLOG3 blabla more_blabla ENDLOG3
ログファイルを分割します。STARTLOG と ENDLOG の間のすべての行を 1 つのピースにします。ピースにエラーが発生した場合は、ピース全体をファイルに抽出します。ファイルは次のようになります。
STARTLOG2
エラー: エラーテキストこれは ユーザー XYZ からの
エラーです ENDLOG2
答え1
これを試して:
$ awk -v RS="STARTLOG" '/ERROR/{print RS$0; }' log
STARTLOG2
ERROR: Errortext
This is an Error
from user XYZ
ENDLOG2
logN
N が からの番号であるというファイルにリダイレクトするにはSTARTLOG
、次を使用します。
gawk -v RS="STARTLOG" '/ERROR/{print RS$0 > "log"$1; }' log
説明
RS
はレコード区切りで、 の「行」が何であるかを定義します。ここでは、レコード全体が 1 行として扱われるようにawk
に設定しています。次に、その「行」に が含まれている場合は、 を出力します( 、これは同じ形式を再現するためだけです)。STARTLOG
ERROR
STARTLOG
RS
Perl でも同じアプローチを使用できます。
perl -lne 'BEGIN{$/="STARTLOG"}{print "$/$_" if /ERROR/}' log