bash命令输出包含特定字符串的文件名

时间:2012-03-05 22:06:26

标签: bash

我知道使用grep来提取与特定字符串匹配的行。现在我有一堆文件,我想知道哪一个包含特定的字符串。有没有办法使用bash命令来实现这一点?谢谢。

2 个答案:

答案 0 :(得分:4)

grep -l只列出文件名。

我一直用它来编辑包含某些内容的文件

vi $(grep -l pattern)  # edit all files containing pattern

如果这个问题没有用,请完善您的问题。

答案 1 :(得分:0)

在我的第一个答案中,评论中给出了一个改进。有多种模式,任务是获取与所有模式匹配的文件列表。包括GNU在内的大多数greps都没有实现正则表达式&交叉运营商。我们能做的是首先获得与第一个模式匹配的文件列表。然后将该文件列表提供给另一个grep以测试下一个模式,依此类推。

一种方法是使用命令替换,这在文件名中有空格时会很笨拙并中断:

grep -l pat2 $(grep -l pat1 $(grep -l pat0 *)))

# $(grep -l pat0 *) gets replaced with the names of files matching pat0
# then $(grep -l pat1 <list>) is further refined to include only those matching pat1
# then $(grep -l pat2 <that-list>) is refined once more

使用xargs的解决方案解决了上述解决方案中的一些弱点以及折叠嵌套。我们获取每个grep -l阶段输出的文件列表,并使用xargs将其转换为下一阶段的参数:

grep -l pat0 * | xargs grep -l pat1 | xargs grep -l pat2

可以编写“编译器”,例如

# the multigrep shell function takes these arguments and produces a pipeline
# like above, then evaluates it using eval.

multigrep pat0 pat1 pat2 *

当然,如果模式只是固定字符串,如原始邮件中所暗示的那样,请在greps中添加-F。