Bash 如何在文本文件中指定的文件中使用grep进行搜索?
我想用grep搜索我在上一步中指定的许多文件中的模式,这些文件现在存储在一个文本文件中 比方说,在第一步中,我使用Bash 如何在文本文件中指定的文件中使用grep进行搜索?,bash,grep,Bash,Grep,我想用grep搜索我在上一步中指定的许多文件中的模式,这些文件现在存储在一个文本文件中 比方说,在第一步中,我使用 grep -l 'pattern1' *.csv >> ~/filenames.txt 列出包含pattern1的所有csv文件的文件名,并将这些文件名保存到filenames.txt中 现在我想搜索上面所有的文件,寻找第二个模式pattern2。 我在找一个像这样的命令 grep -?? 'pattern2' ~/filenames.txt 哪里-??告诉gre
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的所有出现(然后实际计算它们)感兴趣。您可以使用
xargs
来实现此目的:
xargs -I {} grep -H 'pattern' {} < ~/filenames.txt
xargs-I{}grep-H'模式{}<~/filenames.txt
grep
将针对~/filenames
文件中每一行的文件名运行
这也适用于文件名中的空格。您可以使用
xargs
实现以下目的:
xargs -I {} grep -H 'pattern' {} < ~/filenames.txt
xargs-I{}grep-H'模式{}<~/filenames.txt
grep
将针对~/filenames
文件中每一行的文件名运行
这也适用于文件名中的空格。或
ack --files-from=filenames.txt 'pattern'
或者
致:
- 避免使用中间文件
- 并使用嵌入空格或全局模式字符可靠地处理文件名
告诉-l
在匹配的情况下只打印输入文件名grep
用NUL分隔文件名--null
将NUL分隔的文件名解析为单个参数,并将它们传递给第二个xargs-0
命令grep
- 避免使用中间文件
- 并使用嵌入空格或全局模式字符可靠地处理文件名
告诉-l
在匹配的情况下只打印输入文件名grep
用NUL分隔文件名--null
将NUL分隔的文件名解析为单个参数,并将它们传递给第二个xargs-0
命令grep
xargs
选项:grep“pattern”$(xargs-a filenames.txt)
xargs
是正确的工具,但在编写时,您的命令将与带有嵌入空格的文件名中断。注释中提到的变体也是如此。@mklement0:Fair point,我编辑的xargs
命令将处理文件名中的空格。感谢您的更新,但是使用-I
效率低下,因为您将为每个输入文件名分别调用grep
。解决方案是将NUL分隔输入与xargs-0
(Linux和BSD/OSX)或xargs-d'\n'
(仅限Linux)结合使用。没错xargs-d'\n'grep-H'模式'<~/filenames.txt
更好地执行命令另一个xargs
选项:grep”模式“$(xargs-a filenames.txt)
xargs
是正确的工具,但在编写时,您的命令将与带有嵌入空格的文件名中断。注释中提到的变体也是如此。@mklement0:Fair point,我编辑的xargs
命令将处理文件名中的空格。感谢您的更新,但是使用-I
效率低下,因为您将为每个输入文件名分别调用grep
。解决方案是将NUL分隔输入与xargs-0
(Linux和BSD/OSX)或xargs-d'\n'
(仅限Linux)结合使用。这是正确的xargs-d'\n'grep-H'模式'<~/filenames.txt
更好地执行命令您的第一个命令不会返回文件名,但是每一条线都符合你的模式谢谢Benjamin。我已经更新了问题。您的第一个命令不会返回文件名,而是返回与您的模式匹配的各行。谢谢Benjamin。我已经更新了这个问题。
grep -l 'pattern1' *.csv | xargs -d '\n' grep 'pattern2'