我将正则表达式模式的列表传递给grep以检查一个syslog文件。它们通常匹配一个IP地址和日志条目;

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

它只是一个模式列表,比如“1\ 2\.3\.4”。*已经爆炸了“我正在传递的部分,在循环中,所以我不能传递“-v”,例如。

我很困惑,试图做相反的上面,而不是匹配行与某个IP地址和错误所以“!1.2.3.4。*已经爆炸”将匹配syslog行,除了1.2.3.4告诉我它已经爆炸。我必须能够包括一个IP地址不匹配。

我在Stack Overflow上看到过各种类似的帖子。然而,他们使用正则表达式模式,我似乎无法与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

当前回答

(?<!1\.2\.3\.4).*Has exploded

你需要使用-P来运行这个命令以获得负向后查找(Perl正则表达式),所以命令是:

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

试试这个。如果该行前面是1.2.3.4,则使用负向后查找来忽略该行。

其他回答

Grep匹配,Grep -v做逆运算。如果你需要“匹配A而不是B”,你通常使用管道:

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

你需要使用-P来运行这个命令以获得负向后查找(Perl正则表达式),所以命令是:

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"

似乎没有人把所有最好的答案,正则表达式(-E)和匹配反转(-v)混合在一起。

grep -Ev 'pattern1|pattern2|pattern3' file

值得注意的是,不需要查找,所以如果您的grep版本没有-P可用,这也是有效的。