我正在将正则表达式模式列表传递给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行,并告诉我它已爆炸。I必须能够包含不匹配的IP。
我在StackOverflow上看到过很多类似的帖子。但是,它们使用了正则表达式模式,而我似乎不能使用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
发布于 2012-05-02 18:10:13
grep
匹配,grep -v
则相反。如果你需要“匹配A但不匹配B”,你通常使用管道:
grep "${PATT}" file | grep -v "${NOTPATT}"
发布于 2012-05-02 18:12:18
(?<!1\.2\.3\.4).*Has exploded
您需要使用-P运行此命令,以获得负向后视(Perl正则表达式),因此命令为:
grep -P '(?<!1\.2\.3\.4).*Has exploded' test.log
尝尝这个。如果该行前面有1.2.3.4
,它会使用负向查找来忽略该行。希望这能有所帮助!
发布于 2013-09-05 21:55:14
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"
https://stackoverflow.com/questions/10411616
复制相似问题