要查看包含“abc”的所有php文件,我可以使用这个简单的脚本:
find . -name "*php" -exec grep -l abc {} \;
我可以省略-l,我会提取部分内容而不是文件名作为结果:
find . -name "*php" -exec grep abc {} \;
我现在想要的是同时执行这两个版本但同一行的版本。
预期产出:
path1/filename1: lorem abc ipsum
path2/filename2: ipsum abc lorem
path3/filename3: non abc quod
或多或少像grep abc *
那样。
编辑:我想将其用作简单的shell脚本。如果输出在一条线上会很棒,因此可以进一步加倍。但是脚本不一定只有一行,我还是把它放在一个bash脚本文件中。
编辑2:后来我找到了“ack”,这是一个很棒的工具,我现在在大多数情况下使用它而不是grep。它完成了所有这些以及更多。 http://betterthangrep.com/您可以编写ack --php --nogroup abc
来获得所需的结果
答案 0 :(得分:7)
使用-H
开关(man grep
):
find . -name "*php" -exec grep -H abc {} \;
使用xargs
替代(现在不需要-H
切换,至少我在这里的grep
版本):
find . -name "*php" -print | xargs grep abc
修改:由于orsogufo所指出grep
的行为,如果find
,上面的第二条命令应使用-H
可以想象只返回一个文件名(即如果只有一个PHP文件)。如果orsogufo的评论w.r.t. -print0
也被合并,命令变为:
find . -name "*php" -print0 | xargs -0 grep -H abc
编辑2: POSIX建议的A(更多 1 )Jonathan Leffler兼容版本,通过使用/dev/null
避免-H
开关:
find . -name "*php" -print0 | xargs -0 grep abc /dev/null
1 :来自opengroup.org manual on find
提示-print0
非标准的提示:
SVR4的find实用程序的一个功能是 -exec primary的+终结符。这个 允许包含特殊的文件名 字符(尤指s) 没有的组合在一起 如果这样的文件名出现问题 通过管道输送到xargs。其他 实现增加了其他方式 解决这个问题,特别是一个 -print0 primary用空字节终止符写入文件名。 这是 在这里考虑,但没有被采纳。 使用null终止符意味着任何 将要处理的实用程序 find的-print0输出必须添加一个新的 解析null终止符的选项 它现在正在阅读。
答案 1 :(得分:2)
如果您不需要递归搜索,则可以执行..
grep -H abc *.php
..它为您提供所需的输出。 -H
是默认行为(至少在OS X版本的grep上),所以你可以省略:
grep abc *.php
您可以使用-R
标记递归grep,但是您无法将其限制为.php
个文件:
grep -R abc *
同样,这具有相同的期望输出。
我知道这并没有完全回答你的问题,它只是......另一种选择......以上只是一个标志的grep,所以比find
/ -exec
更容易记住/ grep
/ xargs
组合! (与脚本无关,但对于日常的shell'ing非常有用)
答案 2 :(得分:1)
find /path -type f -name "*.php" | awk '
{
while((getline line<$0)>0){
if(line ~ /time/){
print $0":"line
#do some other things here
}
}
}'