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)'


この種の構造化データを記録するもう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

次のようなgawkPerlソリューションスチールドライバーの回答gawk利用できない場合:

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

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

関連情報