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

use*_*021 3 bash shell grep find

要查看包含"abc"的所有php文件,我可以使用这个简单的脚本:

find . -name "*php" -exec grep -l abc {} \;
Run Code Online (Sandbox Code Playgroud)

我可以省略-l,我将提取内容的一部分而不是文件名作为结果:

find . -name "*php" -exec grep abc {} \;
Run Code Online (Sandbox Code Playgroud)

我现在想要的是同时执行这两个版本但同一行的版本.

预期产量:

path1/filename1: lorem abc ipsum
path2/filename2: ipsum abc lorem
path3/filename3: non abc quod
Run Code Online (Sandbox Code Playgroud)

或多或少喜欢grep abc *.

编辑:我想将它用作一个简单的shell脚本.如果输出在一条线上会很棒,因此可以进一步加倍.但是脚本没有必要只有一行,我还是把它放在一个bash脚本文件中.

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

Ste*_*202 7

使用-H开关(man grep):

find . -name "*php" -exec grep -H abc {} \;
Run Code Online (Sandbox Code Playgroud)

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

find . -name "*php" -print | xargs grep abc
Run Code Online (Sandbox Code Playgroud)

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

find . -name "*php" -print0 | xargs -0 grep -H abc
Run Code Online (Sandbox Code Playgroud)

编辑2:Jonathan Leffler提出的(更多1)POSIX兼容版本,通过使用避免交换机:/dev/null-H

find . -name "*php" -print0 | xargs -0 grep abc /dev/null
Run Code Online (Sandbox Code Playgroud)

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

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