如何用grep查询的所有文件中的两个字符串(How to grep query all files

2019-10-20 20:50发布

开始了:

我需要查询的PHP文件,这两者有一个TODO声明,以及我的名字 。 两个串可以是文件(即线)中的任何位置并在0无穷线(位置0-N)的任意位置。

如何用grep查询我的名字:

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

输出:

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

如何到grep的待办事项查询

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)

Answer 1:

该行看起来丑陋,但它应该给你想要的东西:

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将上市。



Answer 2:

问的第一个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将只对已过滤的结果运行。



Answer 3:

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

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


Answer 4:

人们正在这更复杂然后它需要。 -exec将运行命令的退出代码和逻辑上使用它find 。 所以,你可以做

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

这将让该-print只有当两个-exec块返回0。



文章来源: How to grep query all files for two strings