【问题标题】:How to grep query all files for 2 strings when filenames have spaces?当文件名有空格时,如何 grep 查询所有文件的 2 个字符串?
【发布时间】:2017-07-06 08:13:06
【问题描述】:

我需要查询同时具有字符串“rESTWSLib”和“500”的 java 文件。 这两个字符串都可以位于文档中的任何位置(即行),并且可以位于 0-无限行(位置 0-n)上的任何位置。

如何 grep 查询“rESTWSLIB”:

find -iname '*.java' -type f -exec grep -l "rESTWSLib" '{}' \; > ~/SMCrestwsList1.txt

输出:

./some/file1.java
./some/file2.java

如何 grep 查询“500”:

find -iname '*.java' -type f -exec grep -l "500" '{}' \; > ~/SMCrestwsList2.txt

输出:

./some/file2.java
./some/file3.java

我需要将两个 grep 查询(或它们的结果)结合起来,所以我希望得到这样的结果:

./some/file2.java

我已经尝试了How to grep query all files for 2 strings中给出的解决方案

find -iname '*.java' -type f -exec grep -l "rESTWSLib" '{}' + | xargs grep -l "500" \; > ~/SMCrestwsList3.txt

但是,由于很少有文件名称中包含空格,因此仅给出部分输出并带有以下错误消息:

grep: ;: No such file or directory
grep: ./cdrm/bat/OpportunityManagement/Verify: No such file or directory

文件名是“验证某事”。

如何调整它以接受文件名中的空格?

【问题讨论】:

    标签: bash command-line grep find csh


    【解决方案1】:

    尝试使用正则表达式:

    find -iname '*.java' -type f -exec grep -lzo "rESTWSLib.*500\|500.*rESTWSLib" '{}' \; > ~/SMCrestwsList1.txt
    

    【讨论】:

    • 试过了。不返回任何结果。
    • 这仅在两个字符串在同一行时才有效。
    • @GrishaLevit - 忘了那个,z 应该让它忽略新行。 @InsecureNoob 立即尝试。
    • 除非文件有一个空字节:)
    • 那么它们不会是 Java 源文件,对吗? ;)(公平地说,OP 从未声称这些是 Java 源文件)
    【解决方案2】:

    要成功处理带有空格的文件名,您应该使用grep -Zxargs -0 修改您的管道。这些匹配选项将grep 更改为打印由\0 字符分隔的文件名,并将xargs 更改为期望空分隔的输入字符串。

    find . -exec grep -lZ "expr_one" {} \+ | xargs -0 grep -l "expr_two"
    

    【讨论】:

      猜你喜欢
      • 2014-10-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-28
      • 2013-06-22
      相关资源
      最近更新 更多