次のログファイルがあります。 .. このファイルが2 行の間にsome_error_message
("" で示されている場合)、リモートのsome_error_message
ftp/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/p
in コマンドは、sed
2 つの正規表現に一致する行で始まり、終了するブロック間の行だけを印刷します。また、デフォルトでは、行を印刷しないようにパラメータを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