我正在传递正则表达式模式列表grep
以检查syslog文件。它们通常与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上看到了许多类似的帖子,但是他们使用了我似乎无法使用的正则表达式模式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
您是说有时要匹配某个模式,而其他时候想要匹配某个模式以外的所有内容吗?(这似乎是一个奇怪的要求,但无论如何)。在这种情况下,为什么不遍历两个不同的模式列表?
—
Beerbajay 2012年
我对正则表达式不是很了解。我不想为“ Has Exploded”使用grep,因为我不想对每个日志记录设备都了解这一点,所以我可以在某条语句中以某种方式为“ Has Exploded”和!9.10.11.12进行grep吗?
—
jwbensley,2012年
如果您绝对必须在一项声明中做到这一点,那么正如Neil所建议的那样,消极后顾之忧是必经之路。看到我的评论在那里。
—
Beerbajay 2012年
根据@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
假定使用更多的元字符,因此某些转义符可能需要从其他匹配表达式中删除。