提问人:jerrygarciuh 提问时间:8/23/2010 最后编辑:Mateen Ulhaqjerrygarciuh 更新时间:11/14/2023 访问量:1239231
使用 grep 进行负匹配(匹配不包含 foo 的行)[duplicate]
Negative matching using grep (match lines that do not contain foo) [duplicate]
问:
如何使用匹配所有与特定模式不匹配的线条?我试过这个:grep
grep '[^foo]'
答:
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
值得一提的是,对于多个(负)匹配,可以使用选项:-e
grep -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 将模式解释为扩展的正则表达式,即-E
grep -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/'
既不包含也不包含的行:foo
bar
awk '!/foo/ && !/bar/'
既不包含也不包含 OR 的行 :foo
bar
foo2
bar2
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/2361131mmin
60 mins
-type f
上一个:\d 效率低于 [0-9]
评论