ログに記録して、ログ エントリ区切り文字間のテキストを検索する方法はありますか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ソリューションはgawk
、steeldriverの回答gawk
利用できない場合は:
perl -ne 'BEGIN{$/= "-"x72 . "\n"} chomp and print if /Fields/' log_file
72 を区切り文字内の実際のダッシュ数に置き換えます。