如何grep查询两个字符串的所有文件

时间:2014-09-04 12:08:08

标签: bash command-line grep find combinations

我们走了:

我需要查询php文件,这些文件都有一个TODO语句以及我的名字。 两个字符串都可以在文档中的任何位置(即。行),并且位于0-无限行(位置0-n)的任何位置。

如何grep查询我的名字:

find -name '*.php' -exec grep -in "fincken" {} +

输出:

./some/file.php:51: ramon fincken
./somefile.php:2: rfincken

如何grep查询TODO

find -name '*.php' -exec grep -n "TODO" {} +

输出:

./some/file.php:53: // TODO: foobar!
./some/otherfile.php:53: // TODO: foobar?

我需要结合两个grep查询(或其结果),所以我期待这样做:

./some/file.php

我在一个grep中尝试过运算符,但是他们希望同一行和特定顺序的两个字符串或..想出所有结果(OR .. OR)而不是(AND)

4 个答案:

答案 0 :(得分:2)

这条线看起来很难看,但它应该给你想要的东西:

find whatever...|xargs grep -il 'fincken'
                |xargs grep -il 'todo'
                |xargs grep -in -e'todo' -e'fincken'  

输出如下:

/foo/bar/file : 100:TODO
/foo/bar/file : 101:fincken

仅列出同时包含TODOfincken的文件。

答案 1 :(得分:1)

要求第一个grep仅返回文件名,然后换行到另一个grep

find -name '*.php' -exec grep -li "fincken" {} + | xargs grep -l "TODO"

man grep-l(L)返回文件名。这样,find comman将返回一个文件列表,这些文件将通过xargs命令逐个处理。

您的输出将是包含" fincken"的文件列表。和" TODO"。如果你想添加更多的单词,你可以管道更多xargs grep -l


你也可以单独使用grep,使用-R进行递归搜索:

grep -Rl --include="*php" "TODO" * | xargs grep -il "fincken"

注意我首先要移动TODO grep,因为你使用-i来表示" fincken"而且速度慢。这样,grep -i只会在已过滤的结果上运行。

答案 2 :(得分:0)

您可以通过第二个grep管道第一个grep,获取文件的名称并跳过重复:

find -name '*.php' -exec grep -in "fincken" {} + | grep TODO | cut -d: -f1 | uniq

答案 3 :(得分:0)

人们正在变得越来越复杂。 -exec将获取其运行的命令的退出代码,并在find中逻辑使用它。所以你可以做到

find -name '*.php' -exec grep -iq "fincken" {} \; -exec grep -iq "TODO" {} \; -print

仅当两个-print块都返回0时才会到达-exec