【发布时间】:2022-12-14 07:12:49
【问题描述】:
如何使用grep匹配所有不匹配特定模式的行?我试过这个:
grep '[^foo]'
【问题讨论】:
-
[^error_log] 无论如何都不会工作,[] 是 char 类, regexp 通常不擅长否定模式(除非引擎实现否定先行)。
如何使用grep匹配所有不匹配特定模式的行?我试过这个:
grep '[^foo]'
【问题讨论】:
grep -v 是你的朋友:
grep --help | grep invert
-v, --invert-match 选择不匹配的行
另请查看相关的
-L(-l的补充)。-L, --files-without-match 只打印不包含匹配项的文件名
【讨论】:
-e 选项:grep -v -e 'negphrase1' -e 'negphrase2'
grep -v 'negphrase1|negphrase2|negphrase3'
-E 强制 grep 将模式解释为扩展正则表达式有效,即 grep -vE 'negphrase1|negphrase2|negphrase3'
grep "" /dev/null * | grep foo | grep -v bar | cut -d: -f1 | sort -u(why the first grep?,总有办法:))
您也可以将 awk 用于这些目的,因为它允许您以更清晰的方式执行更复杂的检查:
不包含foo的行:
awk '!/foo/'
既不包含foo也不包含bar的行:
awk '!/foo/ && !/bar/'
既不包含foo也不包含bar但包含foo2或bar2的行:
awk '!/foo/ && !/bar/ && (/foo2/ || /bar2/)'
等等。
【讨论】:
grep。为什么要投票?
在您的情况下,您可能不想使用 grep,而是向 find 命令添加一个否定子句,例如
find /home/baumerf/public_html/ -mmin -60 -not -name error_log
如果您想在名称中包含通配符,则必须将它们转义,例如排除后缀为 .log 的文件:
find /home/baumerf/public_html/ -mmin -60 -not -name *.log
【讨论】:
mmin 来搜索在 60 mins 内修改的文件,但也可以使用 -type f,如此处所述 stackoverflow.com/a/33410471/2361131