ログファイルを複数の部分に分割し、エラーを検索します。

ログファイルを複数の部分に分割し、エラーを検索します。

ログファイルを複数の部分に分割し、その部分でエラーを検索したいと思います。エラーが発生した場合は、関連するログファイルの断片を別のファイルに入れたいと思います。

小さな例:

ログファイルは次のとおりです。

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

名前付きファイル(logNNは数字)にリダイレクトするには、STARTLOG次のようにします。

gawk -v RS="STARTLOG" '/ERROR/{print RS$0 > "log"$1; }' log

説明する

RS「行」の意味を定義するレコード区切り文字ですawk。ここでは、STARTLOGレコード全体を1行として扱うように設定しました。次に、対応する「行」にが含まれている場合はERROR印刷しますSTARTLOGRSこれは同じ形式を再作成するためのものです)。

Perlでも同じアプローチを使用できます。

perl -lne 'BEGIN{$/="STARTLOG"}{print "$/$_" if /ERROR/}' log 

おすすめ記事