## を含む 2 行間のエラーを一致させる正規表現

## を含む 2 行間のエラーを一致させる正規表現

次のログファイルがあります。 .. このファイルが2 行の間にsome_error_message("" で示されている場合)、リモートのsome_error_messageftp/sftp サイトでエラーが発生したと仮定します。####

some content in log file..
##
some content in log file..

some_error_message

some content in log file..
##
some content in log file..

some_error_messageそれでは、シンボルを含む行に一致する正規表現を作成したいと思います。##

以下は単なる例です。

grep -iq "^[#][#].*some_error_message.*[#][#]$"

助けてください! !

注:ログには4つの#記号のみが表示されます。もう。 1行には##、もう1行には##です。

答え1

このようなツールはgrep一度に1行だけ一致させることができるのでgrep

sed入れ子になったブロック内の部品のみを抽出してパイピングするなどのツールを使用して、grep関心のあるエラーメッセージを見つけることができます。

/START/,/END/pin コマンドは、sed2 つの正規表現に一致する行で始まり、終了するブロック間の行だけを印刷します。また、デフォルトでは、行を印刷しないようにパラメータをsed渡す必要があります。-n

だから:

$ sed -n '/^##$/,/^##$/p' mylogfile.txt |
  grep -iq '^some_error_message$'

答え2

Perlはこれを簡単に処理できます。範囲演算子(時にはflip-flop演算子とも呼ばれる):

perl -nle 'if (/^##/.../^##/) {print if /some_error_message/i}' file

##これは、行の先頭に固定され、開始して終了するブロックを見つけるファイルを読み取ります。ブロック内でトークンを含むすべての行がsome_error_message印刷されます。この例では、「some_error_messsage」の一致は大文字と小文字を区別しません。

答え3

それは単純なバージョンですsed(通常はsed出力をパイプする必要はなく、コマンドをに接続するだけです;)。

sed '/^##$/,//!d;/some_error_message/!d'

^##$まず(ある行)から空のパターンまでのアドレス範囲を作成します##(つまり、最後のパターンを繰り返すので、別の行が繰り返されることを意味します)##。一致を元に戻し、!範囲d外のすべての項目を削除します。

次に、()を含まないdすべての行を削除します。!some_error_message

関連情報