web-dev-qa-db-ja.com

grep正規表現に文字列が含まれていません

Syslogファイルをチェックするために、正規表現パターンのリストをgrepに渡しています。それらは通常、IPアドレスとログエントリに一致しています。

grep "1\.2\.3\.4.*Has exploded" syslog.log

これは、渡している"1\.2\.3\.4.*Has exploded"部分のようなパターンのリストです。ループの中に入っているので、たとえば "-v"を渡すことはできません。

上記の逆を実行しようとすると混乱します。特定のIPアドレスとエラーのある行には一致しませんので、「!1.2.3.4。*展開しました」とSyslogの行が一致します。 。 I 必須一致しないIPを含めることができる.

私はStackOverflorに似たような様々な投稿を見たことがありますが、それらは正規表現パターンを使っていて、grepでうまく動かないようです。誰かがgrepの実用的な例を提供できますか?

PDATE:これはこのようなスクリプトで起こっています。

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
147
jwbensley

grepは一致し、grep -vはその逆を行います。 「Aと一致するがBとは一致しない」必要がある場合は、通常パイプを使用します。

grep "${PATT}" file | grep -v "${NOTPATT}"
272
beerbajay
(?<!1\.2\.3\.4).*Has exploded

後ろを負にするには(Perlの正規表現)、-Pを付けてこれを実行する必要があります。そのため、コマンドは次のようになります。

grep -P '(?<!1\.2\.3\.4).*Has exploded' test.log

これを試して。行の先頭に1.2.3.4が付いている場合、その行を無視するために否定的な後ろ書きを使用します。それが役立つことを願っています!

14
Neil
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

と同じでなければなりません

egrep "(1\.2\.3\.4.*Has exploded|5\.6\.7\.8.*Has died)" logfile.log | egrep -v "9\.10\.11\.12.*Has exploded"    
2
krecker