在匹配行之前显示文件名(grep)

我怎样才能让grep在输出中的匹配行之前显示文件名?

试试这个小窍门,让grep认为它正在处理多个文件,以便显示文件名:

 grep 'pattern' file /dev/null 

还要获得行号:

 grep -n 'pattern' file /dev/null 

如果你有选项-H-n可用( man grep是你的朋友):

 $ cat file foo bar foobar $ grep -H foo file file:foo file:foobar $ grep -Hn foo file file:1:foo file:3:foobar 

选项:

-H,–with-filename

打印每个比赛的文件名。 当有多个文件要search时,这是默认的。

-n, – 行号

在每个输出行的前面加上input文件中的从1开始的行号。 (-n由POSIX指定)

-H可能是一个GNU扩展,但-n由POSIX指定。

没有必要的把戏。

 grep --with-filename 'pattern' file 

用行号:

 grep -n --with-filename 'pattern' file 

怎么样,我设法得到部分感谢,这个职位。

你想find几个文件,可以说有不同的名字,但模式(例如filename=logfile.DATE ),在几个目录中有一个模式(例如/logsapp1, /logsapp2 )的/logsapp1, /logsapp2 。 每个文件都有一个你想grep的模式(比如"init time" ),你想要每个文件的"init time" ,但是知道它属于哪个文件。

 find ./logsapp* -name logfile* | xargs -I{} grep "init time" {} \dev\null | tee outputfilename.txt 

那么outputfilename.txt会是这样的

 ./logsapp1/logfile.22102015: init time: 10ms ./logsapp1/logfile.21102015: init time: 15ms ./logsapp2/logfile.21102015: init time: 17ms ./logsapp2/logfile.22102015: init time: 11ms 

一般来说

 find ./path_pattern/to_files* -name filename_pattern* | xargs -I{} grep "grep_pattern" {} \dev\null | tee outfilename.txt 

说明:

find命令将根据模式search文件名

那么,pipe道xargs -I{}会将find输出redirect到{}

这将是grep ""pattern" {}的inputgrep ""pattern" {}

然后让grep显示文件名\dev\null的技巧

最后,用tee outputfile.txt将输出写入文件

这工作在我的grep版本9.0.5build立1989年。

这是从以前的解决scheme稍作修改。 我的示例在bash脚本中查找stderrredirect: grep '2>' $(find . -name "*.bash")

 grep 'search this' *.txt 

为我工作search所有.txt文件(当然,input您自己的search值)。