首页 文章

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

提问于
浏览
726

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

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

要么

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

我需要查看已修改的所有文件,但名为 error_log 的文件除外 .

I've read about it here,但只找到一个 not -regex模式 .

3 回答

  • 90

    grep -v 是你的朋友:

    grep --help | grep invert
    

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

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

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

  • 1353

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

    不包含 foo 的行:

    awk '!/foo/'
    

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

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

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

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

    等等 .

  • 11

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

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

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

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

相关问题