开始了:
我需要查询的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)
该行看起来丑陋,但它应该给你想要的东西:
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
只有这两个文件TODO
和fincken
将上市。
问的第一个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
将只对已过滤的结果运行。
可以通过管道通过的第二个第一的grep,获取文件名,并跳过重复:
find -name '*.php' -exec grep -in "fincken" {} + | grep TODO | cut -d: -f1 | uniq
人们正在这更复杂然后它需要。 -exec
将运行命令的退出代码和逻辑上使用它find
。 所以,你可以做
find -name '*.php' -exec grep -iq "fincken" {} \; -exec grep -iq "TODO" {} \; -print
这将让该-print
只有当两个-exec
块返回0。