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

Negative matching using grep (match lines that do not contain foo) [duplicate]

提问人:jerrygarciuh 提问时间:8/23/2010 最后编辑:Mateen Ulhaqjerrygarciuh 更新时间:11/14/2023 访问量:1239231

问:

如何使用匹配所有与特定模式不匹配的线条?我试过这个:grep

grep '[^foo]'
正则表达式 grep

评论

15赞 Jaap 11/9/2011
[^error_log] 无论如何都永远不会起作用,[] 是 char 类,正则表达式通常不擅长负模式(除非引擎实现负展望)。

答:

2318赞 Motti 8/23/2010 #1

grep -v是你的朋友:

grep --help | grep invert  

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

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

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

评论

186赞 Babken Vardanyan 6/18/2014
值得一提的是,对于多个(负)匹配,可以使用选项:-egrep -v -e 'negphrase1' -e 'negphrase2'
46赞 Nicholas Adams 8/5/2015
类似于 @Babken-Vardanyan 的评论 此外 - 能够使用管道连接多个匹配项,例如grep -v 'negphrase1|negphrase2|negphrase3'
24赞 Evan Langlois 12/13/2015
最后一条评论是不一样的,因为它会搜索两者都不匹配的东西,而不是两者都匹配。即,如果它与一个匹配但与另一个不匹配,则它仍然打印。使用不相似的字符串尝试两种方式
15赞 Zlemini 11/18/2016
@EvanLanglois - 强制 grep 使用 works 将模式解释为扩展的正则表达式,即-Egrep -vE 'negphrase1|negphrase2|negphrase3'
2赞 Motti 10/25/2017
@OlleHärstedt,我想我在之前的评论中误解了你的场景,以下可能是你要找的(为什么是第一个grep?,总有办法:))grep "" /dev/null * | grep foo | grep -v bar | cut -d: -f1 | sort -u
215赞 fedorqui 6/20/2015 #2

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

不包含 : 的行 :foo

awk '!/foo/'

既不包含也不包含的行:foobar

awk '!/foo/ && !/bar/'

既不包含也不包含 OR 的行 :foobarfoo2bar2

awk '!/foo/ && !/bar/ && (/foo2/ || /bar2/)'

等等。

评论

8赞 Peter T. 9/17/2018
这其实很酷。您甚至不必学习完整的 awk 语言即可将正则表达式与逻辑运算符分组。谢谢你的回答!
4赞 Eduardo Pignatelli 2/9/2022
OP 特别要求 .为什么会投赞成票?grep
1赞 Ed S 3/18/2023
OP 可能不知道这些功能,提供提供相同结果的替代解决方案会很有帮助。awk
22赞 Papa Smurf 11/2/2015 #3

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

find /home/baumerf/public_html/ -mmin -60 -not -name error_log

如果要在名称中包含通配符,则必须对其进行转义,例如排除后缀为 .log 的文件:

find /home/baumerf/public_html/ -mmin -60 -not -name \*.log

评论

0赞 gawkface 4/27/2021
虽然将用于搜索其中修改的文件,但也使用此处提到的 stackoverflow.com/a/33410471/2361131mmin60 mins-type f