如何在文本文件中指定的文件中使用grep进行搜索?

时间:2016-04-12 15:10:17

标签: bash grep

我想用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步结合起来而不使用临时文件名.txt,但了解模拟grep命令(如果存在)也很有趣。

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

3 个答案:

答案 0 :(得分:3)

您可以使用xargs

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

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

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

答案 1 :(得分: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将每个输入行视为一个单独的参数。

答案 2 :(得分:1)

...或

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