【问题标题】:grep Command for Files with "String1" AND NOT "String2"带有“String1”而不是“String2”的文件的 grep 命令
【发布时间】:2016-07-26 10:21:11
【问题描述】:

我浏览了答案 -

  1. Grep regex NOT containing string

  2. http://www.thegeekstuff.com/2011/10/grep-or-and-not-operators/

但我仍然面临一些问题,无法在包含“String1”但不包含“String2”的目录中查找所有文件。

我尝试了以下命令,但随着正确的结果,它还返回包含两个字符串的文件 -

grep -Hrn "String1" . | grep -v -Hrn "String2" 

请纠正我的错误。

【问题讨论】:

  • 从第二个grep 中删除-Hrn-r 将使其在当前目录中递归搜索(基本上忽略您以前的grep),-H 将使其显示文件名(如果它从标准输入获取输入,它就无法做到这一点),并且-n 将使其显示行号(这在您的第一个grep 的输出中会有所不同)。第一个grep 是正确的,会得到正确的文件名和行号,但第二个grep 不是。

标签: linux string macos terminal grep


【解决方案1】:

您可以使用-L 标志:

-L, --files-without-match  print only names of FILEs containing no match

首先您找到包含“String2”的文件,然后运行这些文件并找到确实包含“String1”的文件:

$ grep -L "String2" * | xargs grep -nH "String1"

【讨论】:

  • 我相信-L 选项是一个非标准扩展,但如果你有它,对你有好处。
  • @Maroun 请告诉我稍作修改,以便它适用于目录。现在,它给子目录一个错误 - “grep: dir: Is a directory”
  • @BhavukMathur 再次添加-r 标志。
【解决方案2】:

使用 Awk 很容易。

awk 'FNR==1 { if (NR>1 && one && !other) print prev; one=other=0; prev=FILENAME }
    /string1/ { one=1 }
    /string2/ { other=1 }
    END { if (one && !other) print prev }' list of files

【讨论】:

    猜你喜欢
    • 2011-05-15
    • 1970-01-01
    • 2011-05-23
    • 2020-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-09
    相关资源
    最近更新 更多