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