ログをGrepし、ログ区切り文字間のテキストを取得します。

ログをGrepし、ログ区切り文字間のテキストを取得します。

ログに記録して、ログ エントリ区切り文字間のテキストを検索する方法はありますかgrep? ログ ファイルでは、行エントリが文字 " -------" で区切られているため、テキスト ワードを検索するときは、ログ内の区切り文字の前後のすべての行を検索する必要があります。

サンプルログ

------------------------------------------------------------------------

    r132279 | USERID | 2014-04-30 12:59:09 -0700 (Wed, 30 Apr 2014) | 3 lines
    Removed unused "Calculated Fields" column entry.
    Jira ID: JIRA-977

------------------------------------------------------------------------

上記では、Fieldsという単語をGrepしますが、" ----"行の間にあるすべての行が必要です。

答え1

レコードの大きさがわかっている場合は、一致する行の前( -B)と後( )にコンテキストの追加行を出力できます。例:-A

grep -A2 -B2 'Fields' sample.log

またはマッチラインの前後のコンテキスト

grep -C3 'Fields' sample.log

私の知る限り、GNU grepで真の複数行一致(単一行一致とコンテキストではなく)を行う唯一の方法は、改行による改行を防ぐフラグ-P付きのPCRE正規表現モード( )を使用することです-z。たとえば、次のように試すことができます。

grep -zPo '(\n-+\n)\K(.|\n)+?Fields(.|\n)+?(?=\n-+\n)'

Fieldsこれは、任意の文字または改行で囲まれた文字列の非貪欲な一致を行います。ただし、改行-ハイフン-改行区切り文字。pcregrepでの同等の表現は

pcregrep -Mo '(\n-+\n)\K(.|\n)+?Fields(.|\n)+?(?=\n-+\n)'


この種のレコード構造データに対するもう一つの選択肢はawkです。特にGNU awkでは、内部の正規表現を使用することができます。レコードセパレータRS 例

$ gawk -vRS='\n-+\n' '/Fields/ {print}' sample.log

r132279 | USERID | 2014-04-30 12:59:09 -0700 (Wed, 30 Apr 2014) | 3 lines

Removed unused "Calculated Fields" column entry.

Jira ID: JIRA-977

答え2

Perlソリューションはgawksteeldriverの回答gawk利用できない場合は:

perl -ne 'BEGIN{$/= "-"x72 . "\n"} chomp and print if /Fields/' log_file

72 を区切り文字内の実際のダッシュ数に置き換えます。

関連情報