【发布时间】:2012-05-11 19:14:09
【问题描述】:
我将正则表达式模式列表传递给grep 以检查系统日志文件。它们通常匹配 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 行告诉我它爆炸了。我必须能够包含不匹配的 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
【问题讨论】:
-
你的意思是你有时想要匹配一个模式,但其他时候想要匹配所有除了某个模式? (这似乎是一个奇怪的要求,但无论如何)。在这种情况下,为什么不遍历两个不同的模式列表?
-
好吧,我对正则表达式不是很了解;我不想用 grep 表示“已爆炸”,因为我不想知道每个日志记录设备的情况,所以我能以某种方式在一个语句中用 grep 表示“已爆炸”和 !9.10.11.12 吗?
-
如果您绝对必须在一个声明中执行此操作,则正如 Neil 所建议的那样,消极的后视是要走的路。在那里查看我的评论。
-
使用 PCRE 风格的正则表达式匹配和否定的前瞻断言,根据 @Neil 的回答:
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.logPCRE 假定更多元字符默认情况下,因此可能需要从其他匹配的表达式中删除一些转义。