Bash 如何在文本文件中指定的文件中使用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搜索我在上一步中指定的许多文件中的模式,这些文件现在存储在一个文本文件中

比方说,在第一步中,我使用

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'
或者

致:

  • 避免使用中间文件
  • 并使用嵌入空格或全局模式字符可靠地处理文件名
尝试以下操作(假设您在Linux或BSD/OSX上):

  • -l
    告诉
    grep
    在匹配的情况下只打印输入文件名
  • --null
    用NUL分隔文件名
  • xargs-0
    将NUL分隔的文件名解析为单个参数,并将它们传递给第二个
    grep
    命令
在Linux(使用GNU实用程序)上,您可以稍微简化命令,前提是您不担心嵌入换行符的文件名(非常罕见):

    代码> -'\n '/COD>使<代码> xARGs将每个输入行视为一个单独的参数。
至:

  • 避免使用中间文件
  • 并使用嵌入空格或全局模式字符可靠地处理文件名
尝试以下操作(假设您在Linux或BSD/OSX上):

  • -l
    告诉
    grep
    在匹配的情况下只打印输入文件名
  • --null
    用NUL分隔文件名
  • xargs-0
    将NUL分隔的文件名解析为单个参数,并将它们传递给第二个
    grep
    命令
在Linux(使用GNU实用程序)上,您可以稍微简化命令,前提是您不担心嵌入换行符的文件名(非常罕见):

    代码> -'\n '/COD>使<代码> xARGs将每个输入行视为一个单独的参数。
另一个
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'