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

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

我一直在尝试为这个命令制定语法:

1
grep ! error_log | find /home/foo/public_html/ -mmin -60

1
grep '[^error_log]' | find /home/baumerf/public_html/ -mmin -60

我需要查看除了那些名为error_log的文件之外所有已修改的文件。

我在这里读过,但只找到一个notregex模式。


grep -v是你的朋友:

1
grep --help | grep invert

-v, --invert-match select non-matching lines

还可以查看相关的-L(-L的补充)。

-L, --files-without-match only print FILE names containing no match


您也可以使用awk来实现这些目的,因为它允许您以更清晰的方式执行更复杂的检查:

不包含foo的行:

1
awk '!/foo/'

既不包含foo也不包含bar的行:

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

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

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

等等。


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

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

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

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