
ログファイルを複数の部分に分割し、その部分でエラーを検索したいと思います。エラーが発生した場合は、関連するログファイルの断片を別のファイルに入れたいと思います。
小さな例:
ログファイルは次のとおりです。
STARTLOG1
blabla
more_blabla
ENDLOG1
STARTLOG2エラー
:エラーテキスト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
「行」の意味を定義するレコード区切り文字ですawk
。ここでは、STARTLOG
レコード全体を1行として扱うように設定しました。次に、対応する「行」にが含まれている場合はERROR
印刷しますSTARTLOG
(RS
これは同じ形式を再作成するためのものです)。
Perlでも同じアプローチを使用できます。
perl -lne 'BEGIN{$/="STARTLOG"}{print "$/$_" if /ERROR/}' log