使用grep进行负匹配(匹配不包含foo的行)

jer*_*iuh 912 grep

我一直在试图找出这个命令的语法:

grep ! error_log | find /home/foo/public_html/ -mmin -60
Run Code Online (Sandbox Code Playgroud)

要么

grep '[^error_log]' | find /home/baumerf/public_html/ -mmin -60
Run Code Online (Sandbox Code Playgroud)

我需要查看所有已修改的文件,除了那些已命名的文件error_log.

我在这里读过它,但只发现了一个not-regex模式.

Mot*_*tti 1634

grep -v 是你的朋友:

grep --help | grep invert  
Run Code Online (Sandbox Code Playgroud)

-v, - inverse-match选择不匹配的行

另请查看相关的-L(补充-l).

-L, - files-without-match仅打印不包含匹配项的FILE名称

  • 值得一提的是,对于多个(负)匹配`-e`选项可以使用:`grep -v -e'degphrase1'-e'decphrase2'` (109认同)
  • 类似于@Babken-Vardanyan的评论也 - 能够使用管道加入多个匹配,例如`grep -v'degphrase1 | negphrase2 | negphrase3'` (29认同)
  • 最后的评论与搜索不匹配的内容而不是其中任何内容的内容不同.即如果它匹配一个但不匹配另一个仍然打印.使用非相似字符串尝试两种方式 (11认同)
  • @EvanLanglois - 强制grep将模式解释为使用`-E`的扩展正则表达式,即`grep -vE'donphrase1 | negphrase2 | negphrase3'` (4认同)
  • @OlleHärstedt,我想我在之前的评论中误解了你的场景,以下可能是你正在寻找的 `grep "" /dev/null * | grep foo | grep -v 栏 | 剪切-d:-f1 | sort -u` ([为什么第一个 grep?](/sf/answers/853604671/),总有办法:)) (2认同)
  • 这个疯子在这里 grep grep 的帮助输出。 (2认同)

fed*_*qui 123

您还可以将其awk用于这些目的,因为它允许您以更清晰的方式执行更复杂的检查:

不包含的行foo:

awk '!/foo/'
Run Code Online (Sandbox Code Playgroud)

既不包含foo也不包含bar:

awk '!/foo/ && !/bar/'
Run Code Online (Sandbox Code Playgroud)

既不包含foo也不bar包含其中的行foo2bar2:

awk '!/foo/ && !/bar/ && (/foo2/ || /bar2/)'
Run Code Online (Sandbox Code Playgroud)

等等.

  • OP 特别要求“grep”。为什么这会被投票? (5认同)
  • 那真的很酷.您甚至不必学习完整的awk语言,以便使用逻辑运算符对regexp进行分组.谢谢你的回答! (2认同)

小智 12

在你的情况下,你可能不想使用grep,而是在find命令中添加一个否定子句,例如

find /home/baumerf/public_html/ -mmin -60 -not -name error_log
Run Code Online (Sandbox Code Playgroud)

如果要在名称中包含通配符,则必须将它们转义,例如,排除带有后缀.log的文件:

find /home/baumerf/public_html/ -mmin -60 -not -name \*.log
Run Code Online (Sandbox Code Playgroud)