3

要查看所有包含“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 脚本。如果输出在一行上会很棒,因此可以进行进一步的 grepping。但是脚本不一定只有一行,反正我把它放在一个 bash 脚本文件中。

编辑 2:后来我发现“ack”,这是一个很棒的工具,我现在在大多数情况下使用它而不是 grep。它可以完成所有这些以及更多。http://betterthangrep.com/你会写信ack --php --nogroup abc得到想要的结果

4

3 回答 3

7

使用-H开关 ( man grep):

find . -name "*php" -exec grep -H abc {} \;

替代使用xargs(现在-H不需要开关,至少对于grep我这里的版本):

find . -name "*php" -print | xargs grep abc

编辑:由于orsogufogrep所指出的 ' 行为,上面的第二个命令应该使用if可以想象只返回一个文件名(即,如果只有一个 PHP 文件)。如果 orsogufo 的注释 wrt也被合并,命令变为:-Hfind-print0

find . -name "*php" -print0 | xargs -0 grep -H abc

编辑 2:由Jonathan Leffler提出的(更多1POSIX兼容版本,通过使用避免了开关:/dev/null-H

find . -name "*php" -print0 | xargs -0 grep abc /dev/null

1:来自opengroup.org 手册中关于find非标准提示的引用-print0

SVR4 的 find 实用程序的一个特性是 -exec 主节点的 + 终止符。这允许将包含特殊字符(尤其是 s)的文件名组合在一起,而不会在将此类文件名通过管道传输到 xargs 时出现问题。其他实现添加了其他方法来解决这个问题,特别是 -print0 主文件,它使用空字节终止符编写文件名。此处考虑过,但未采用。 使用空终止符意味着任何要处理 find 的 -print0 输出的实用程序都必须添加一个新选项来解析它现在正在读取的空终止符。

于 2009-07-05T15:37:35.230 回答
2

如果你不需要递归搜索,你可以这样做..

grep -H abc *.php

..它为您提供所需的输出。-H是默认行为(至少在 grep 的 OS X 版本上),所以你可以省略这个:

grep abc *.php

您可以使用该标志递归 grep -R,但不能将其限制为.php文件:

grep -R abc *

同样,这具有相同的期望输出。

我知道这并不能完全回答您的问题,它只是.. 一种替代方法... 以上只是带有单个标志的 grep,因此比find/ -exec/ grep/xargs组合更容易记住!(与脚本无关,但对日常 shell'ing 很有用)

于 2009-07-05T21:58:32.960 回答
1
find /path -type f -name "*.php" | awk '
{
    while((getline line<$0)>0){
        if(line ~ /time/){
            print $0":"line
            #do some other things here
        }
    }    
}'
于 2009-07-06T02:49:35.550 回答