【问题标题】:How to search with grep in files specified in a text file?如何在文本文件中指定的文件中使用 grep 进行搜索?
【发布时间】:2016-04-12 15:10:16
【问题描述】:

我想使用 grep 在我在上一步中指定的多个文件中搜索一个模式,这些文件现在存储在一个文本文件中。

可以说,在第一步中,我使用了

grep -l 'pattern1' *.csv >> ~/filenames.txt 

列出所有包含pattern1的csv文件的文件名,并将这些文件名保存到filenames.txt中

现在我想在上述所有文件中搜索第二种模式,pattern2。 我正在寻找类似的命令

grep -?? 'pattern2' ~/filenames.txt

在哪里 -??告诉 grep 在 filenames.txt 中查找文件名 我知道

grep -f patternfile.txt *.csv

将在所有 csv 文件中搜索 patternfile.txt 中定义的模式。是否有一个模拟命令用于搜索在一个充满文件名的文件中指定的所有文件?

我也很高兴听到有关我的整体问题的替代解决方案,例如以某种方式将第 1 步和第 2 步组合在一起,而不使用临时 filenames.txt,但了解模拟 grep 命令(如果存在)也会很有趣。

明确地说,我不只是在寻找包含 pattern1 和 pattern2 的文件。我对 pattern1 至少出现一次的文件中所有出现的 pattern2(然后实际计算它们)感兴趣。

【问题讨论】:

  • 您的第一个命令不会返回文件名,而是返回与您的模式匹配的各个行。
  • 谢谢本杰明。我已经更新了问题。

标签: bash grep


【解决方案1】:

您可以为此使用xargs

xargs -I {} grep -H 'pattern' {} < ~/filenames.txt

grep 将针对来自~/filenames 文件的每一行的文件名运行。

这也适用于文件名中的空格。

【讨论】:

  • 另一个xargs 选项:grep "pattern" $(xargs -a filenames.txt)
  • xargs 是正确使用的工具,但正如所写的那样,您的命令将与嵌入空格的文件名中断。 cmets 中提到的变体也是如此。
  • @mklement0:公平点,我编辑的xargs 命令将适用于文件名中的空格。
  • 感谢更新,但使用-I 效率低下,因为您将为每个输入文件名单独调用grep。解决方案是使用 NUL 分隔的输入结合 xargs -0(Linux 和 BSD/OSX)或 xargs -d '\n'(仅限 Linux)。
  • 没错xargs -d '\n' grep -H 'pattern' &lt; ~/filenames.txt 是更好的执行命令
【解决方案2】:

收件人:

  • 避免需要中间文件,
  • 并稳健地处理带有嵌入空格或通配符的文件名,

尝试以下操作(假设您使用的是 Linux 或 BSD/OSX):

grep -l --null 'pattern1' *.csv | xargs -0 grep 'pattern2'
  • -l 告诉 grep 在匹配的情况下只打印输入文件名
  • --null 用 NUL 分隔文件名
  • xargs -0 将 NUL 分隔的文件名解析为单独的参数,并将它们传递给第二个 grep 命令。

在 Linux(使用 GNU 实用程序)上,您可以稍微简化命令,假设您不担心带有嵌入换行符的文件名(非常罕见):

grep -l 'pattern1' *.csv | xargs -d '\n' grep 'pattern2'
  • -d '\n' 使 xargs 将每个输入行视为一个整体。

【讨论】:

    【解决方案3】:

    或者...

    ack --files-from=filenames.txt 'pattern'
    

    【讨论】:

      猜你喜欢
      • 2019-04-09
      • 2020-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-14
      • 1970-01-01
      • 1970-01-01
      • 2022-01-13
      相关资源
      最近更新 更多