要查看包含所有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
获得期望的结果
使用-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输出的任何工具必须添加一个新的选项来解析空终止它现在会读书。
如果您不需要递归搜索,你可以做..
grep -H abc *.php
..这为您提供了所需的输出。 -H
是默认的行为(至少在grep的的OS X版本),所以你可以忽略这一点:
grep abc *.php
你可以grep递归使用-R
标志,但你无法限制它.php
文件:
grep -R abc *
同样,这具有相同的希望的输出。
我知道这并不完全回答你的问题,它只是..替代......以上只是用一个标志的grep,所以比更容易记住find
/ -exec
/ grep
/ xargs
组合! (无关的脚本,但对于一天到一天shell'ing有用)
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