我想用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(然后实际计算它们)感兴趣。
答案 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'