我们走了:
我需要查询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)
答案 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
仅列出同时包含TODO
和fincken
的文件。
答案 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
。