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)'
この種の構造化データを記録するもう1つのオプションは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
次のようなgawk
Perlソリューションスチールドライバーの回答gawk
利用できない場合:
perl -ne 'BEGIN{$/= "-"x72 . "\n"} chomp and print if /Fields/' log_file
72 を区切り記号の実際のダッシュ数に置き換えます。