写一个shell脚本,发现-里grep和1线输出的文件名和内容(Write a shell scri

2019-07-29 15:57发布

要查看包含所有PHP文件“ABC”我可以用这个简单的脚本:

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:后来我发现“确认”,这是一个伟大的工具,我现在在大多数情况下,而不是grep的使用。 它这样做的更多。 http://betterthangrep.com/你会写ack --php --nogroup abc获得期望的结果

Answer 1:

使用-H开关( man grep ):

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

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

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

编辑:作为结果grep是由著名的行为orsogufo ,上面的第二个命令应该使用-H如果find可以想见,只返回一个单一的文件名(即如果只有一个单一的PHP文件)。 如果orsogufo的评论WRT -print0也纳入,命令变为:

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

编辑2:A(1) POSIX兼容的版本作为提出乔纳森莱弗勒 ,其通过使用/dev/null避免-H开关:

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

1:从A报价上opengroup.org手动find暗示-print0是非标准:

SVR4的find工具的特点是-exec主要的+终结者。 这使得包含特殊字符(特别是多个)的文件名被分组在一起,而不如果这样的文件名被管道输送到xargs的发生的问题。 其他的实现都增加了其他的方法来解决这个问题,尤其是写文件名以空字节终止一个-print0主。 这被认为是在这里,但未获通过。 使用空终止意味着这是要处理发现的-print0输出的任何工具必须添加一个新的选项来解析空终止它现在会读书。



Answer 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有用)



Answer 3:

find /path -type f -name "*.php" | awk '
{
    while((getline line<$0)>0){
        if(line ~ /time/){
            print $0":"line
            #do some other things here
        }
    }    
}'


文章来源: Write a shell script that find-greps and outputs filename and content in 1 line