编写一个shell脚本find-greps并输出1行的文件名和内容

时间:2009-07-05 15:30:53

标签: bash shell find grep

要查看包含“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来获得所需的结果

3 个答案:

答案 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
        }
    }    
}'