2016-03-30 1 views
0

私は長いログを解析していますが、各イベントのログメッセージには通常1行以上が必要です。各イベントのハードコーディングされた行番号を使用する場合は、grep -A $EventLineNumbersを使用して各イベントのメッセージ全体を取得できます。各grep(-Aオプション付き)の結果を個別に処理する方法は?行単位ではなくアイテム単位で

たとえば、あるイベントの2つのデータフィールドに対して20行のメッセージでgrepしたいとします。そのイベントはログに100回記録されることがあります。 1つのデータフィールドがイベントの1つに存在しない場合、別のイベントからデータを取り込み、以前のイベントと「バンドル」するため、行ごとにプロセスのgrep結果を回避する必要があります。

要するに、コマンドで-Aオプションを設定した場合、各grepを個別に処理するにはどうすればよいですか?

+0

ログに記録されたイベントには、ログ/ストリームの各イベントを検出するための境界やマーカーがありますか? –

+0

あなたが説明している問題と期待される出力をカバーする小さなサンプルデータセットを含める必要があります。読者はエビデンスベースのQ/Aですぐに潜り込むことができますが、問題の説明がある場合は20個のQをプレイするようになります。ハイライトされたテキストの編集ボックスの左上にある '{}'ツールを使用して、code/data/output/errmsgs /などの正しい書式を維持します。がんばろう。 – shellter

答えて

0

この種の解析では、awk(1)を使用します。 grep(1)と比較すると、変数や条件を簡単に使用できます。だから、次のことができます。興味のあるラインの束の開始を示すライン(S)上の

  1. 一致関連するフィールド
  2. を覚えて、この状態を、以下の
  3. プロセスラインを覚えておく変数を設定
  4. あなたはラインのこの束の端に到達したとき
  5. は、実際には、これらの行は面白いされていない場合、あなたは状態をリセットし、次の面白いメッセージにスキップすることができますフォーマットされた情報に

を印刷します。

コマンドは単純なgrepよりも長くなりますが、簡潔なままであり、完全なプログラミング言語を使用する必要はありません。

0

これは動作するはずです:

例入力:

1 
2 
3 
1 
4 
5 
6 
2 
4 

をすべてのブロックが3行があることを、あなたはそれで1とブロックを一致させたいと仮定します。次のコードは動作します:

echo -e '1\n2\n3\n1\n4\n5\n6\n2\n4' | grep 1 -A2 | awk -v n=3 '{print} NR % 3 == 0 { printf "\0" }' | xargs -0 -n 1 echo -n "WOOT: " 

説明:

grep 1 -A2は、関連するブロックを見つけるためにあなたの表現です。私は、一致する式がブロックごとに1回だけ発生すると仮定します。 -A2は、マッチ後の2つの文脈のためのものです。

awk -v '{print} NR % 3 == 0 { printf "\0" }'は、awkに3行ごとに\ 0文字を出力するように指示します。この場合も、該当するブロックサイズに合わせて調整します。次のコマンドにはこれが必要です。

xargs -0 -n1の部分は、次のコマンド(あなたのための余分なフィルタ)を実行し、ブロック全体を与えます。ヌルで終了する項目(ブロック)の場合は-0、次のコマンドには1つの項目を渡す場合のみ-n1です。

WOOT: 1 
2 
3 
WOOT: 1 
4 
5 

エコーが正確に一度、各ブロックのために実行されたことを意味:

は私の例では、これは次のような出力が得られます。

関連する問題