Grep正则表达式不包含字符串

时间:2012-05-02 10:06:40

标签: regex grep

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

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

这只是一个模式列表,比如我在循环中传递的"1\.2\.3\.4.*Has exploded"部分,所以我不能传递“-v”作为例子。

我很困惑,尝试做上面的反向,一个NOT匹配行具有某个IP地址和错误,所以“!1.2.3.4。*已爆炸”将匹配系统日志行除了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

3 个答案:

答案 0 :(得分:268)

grep匹配,grep -v执行相反的操作。如果你需要“匹配A而不是B”,你通常使用管道:

grep "${PATT}" file | grep -v "${NOTPATT}"

答案 1 :(得分:13)

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

你需要使用-P来运行它以获得负面的lookbehind(Perl正则表达式),所以命令是:

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

试试这个。如果前面有1.2.3.4,则使用负向lookbehind来忽略该行。希望有所帮助!

答案 2 :(得分:2)

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"