Grep正则expression式不包含string

我正在传递一个正则expression式列表来grep检查系统日志文件。 他们通常匹配一个IP地址和日志条目;

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

这只是一个模式列表,如"1\.2\.3\.4.*Has exploded"部分,我正在通过一个循环,所以我不能通过“-v”例如。

我很困惑,试图做上面的逆,一个不匹配具有一定的IP地址和错误的线路,所以“!1.2.3.4。*爆炸了”将匹配syslog行以外的其他任何东西1.2.3.4告诉我它已经爆炸。 我必须能够包含一个IP不匹配。

我已经看到了StackOverflor上的各种类似的post,但是他们使用正则expression式,我似乎无法使用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 

grep匹配, grep -v反过来。 如果你需要“匹配A而不是B”,你通常使用pipe道:

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

你需要用-P来运行这个方法,否则会产生负面后顾(Perl正则expression式),所以命令是:

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

尝试这个。 如果前面有1.2.3.4那么它使用负向倒序来忽略该行。 希望有所帮助!

 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"