grep
syslogファイルと照合するための正規表現パターンのリストを渡します。それらは通常、IPアドレスとログエントリに一致します。
grep "1\.2\.3\.4.*Has exploded" syslog.log
これ"1\.2\.3\.4.*Has exploded"
は、ループで渡した部分のような単なるパターンのリストなので、たとえば "-v"を渡すことはできません。
上記の逆を行おうとすると混乱します。特定のIPアドレスとエラーの行を一致させないので、「!1.2.3.4。*展開されました」は、1.2.3.4以外のsyslog行と一致し、展開されたことを通知します。 。私がしなければならないと一致しないようにIPを含めることができるよう。
StackOverflorで同様の投稿をいくつか見てきましたが、それらは正規表現パターンを使用しているため、で操作できないようですgrep
。誰かが実用的な例をgrep
教えてくれますか?
更新: これは、次のようなスクリプトで発生しています。
patterns[1]="1\.2\.3\.4.*Has exploded"
patterns[2]="5\.6\.7\.8.*Has died"
patterns[3]="\!9\.10\.11\.12.*Has exploded"
for i in {1..3}
do
grep "${patterns[$i]}" logfile.log
done
あるパターンに一致したい場合もあれば、特定のパターン以外のすべてに一致したい場合もありますか?(これは奇妙な要件のようですが、何でも)。その場合は、2つの異なるパターンのリストを反復処理してみませんか?
—
beerbajay
まあ、私は正規表現についてあまり詳しくありません。すべてのロギングデバイスについてこれを知りたくないので、「Has Exploded」をgrepしたくないので、「Has Exploded」と!9.10.11.12を1つのステートメントでどうにかgrepできますか?
—
jwbensley
ニールが示唆しているように、1つのステートメントで絶対に実行する必要がある場合は、否定的な後読みが有効です。そこで私のコメントを見てください。
—
beerbajay
@Neilの回答に従って、PCREスタイルの正規表現マッチングと否定先読みアサーションを使用します。PCREの
—
Codex24
patterns[3]="\!9\.10\.11\.12.*Has exploded"
変更 patterns[3]="(?<!9\.10\.11\.12).*Has exploded"
とgrep "${patterns[$i]}" logfile.log
変更 grep -P "${patterns[$i]}" logfile.log
は、デフォルトでより多くのメタ文字を想定するため、他のマッチング式からエスケープの一部を削除する必要がある場合があります。