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

jwb*_*ley 162 regex grep

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

grep "1\.2\.3\.4.*Has exploded" syslog.log
Run Code Online (Sandbox Code Playgroud)

它只是一个模式列表,比如"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
Run Code Online (Sandbox Code Playgroud)

bee*_*jay 305

grep匹配,grep -v反过来.如果你需要"匹配A而不是B",你通常使用管道:

grep "${PATT}" file | grep -v "${NOTPATT}"
Run Code Online (Sandbox Code Playgroud)

  • 您确实可以使用“-v”并且可以在循环中使用它。也许您需要更具体地了解您的限制,或者您可能对脚本应该如何工作有误解。尝试发布一些代码。 (3认同)

Nei*_*eil 15

(?<!1\.2\.3\.4).*Has exploded
Run Code Online (Sandbox Code Playgroud)

您需要使用-P运行它以具有负的lookbehind(Perl正则表达式),因此命令是:

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

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

  • 我很确定 `grep` 不支持环视。除非您使用 Gnu `grep` 并使用 `--P` 参数使其使用 PCRE 引擎。 (3认同)

ZX9*_*ZX9 14

似乎没有人发布了所有答案中最好的答案的混合,正则表达式 ( -E) 与匹配反转 ( -v)

grep -Ev 'pattern1|pattern2|pattern3' file
Run Code Online (Sandbox Code Playgroud)

值得注意的是,不需要环视,因此如果您的 grep 版本不可用,这将起作用-P