在匹配行之前显示文件名

时间:2013-03-15 12:12:25

标签: unix grep

如何让grep在输出中的匹配行之前显示文件名?

6 个答案:

答案 0 :(得分:379)

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

grep 'pattern' file /dev/null

还要获取行号:

grep -n 'pattern' file /dev/null

答案 1 :(得分:254)

如果您有选项-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

     

打印每场比赛的文件名。这是默认值   多个文件到                 搜索范围。

     

-n, - line-number

     

在每行输出中添加基于1的行号   输入文件。 (-n是                 由POSIX指定。)

-H是GNU扩展程序,但-nspecified by POSIX

答案 2 :(得分:38)

没有必要的技巧。

grep --with-filename 'pattern' file

使用行号:

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

答案 3 :(得分:5)

这个怎么样,我设法实现了部分感谢这篇文章。

你想要找到几个文件,让我们说几个带有模式的目录(例如filename=logfile.DATE)具有不同名称的日志(例如/logsapp1, /logsapp2)(例如"init time")。 每个文件都有一个您想要grep的模式(例如"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

说明:

xargs -I{}命令将根据模式

搜索文件名

然后,管道find会将{}输出重定向到grep ""pattern" {}

将是grep

的输入

然后让\dev\null显示文件名tee outputfile.txt

的技巧

最后,使用grep

将输出写入文件

这在IllegalArgumentException版本9.0.5 build 1989中对我有用。

答案 4 :(得分:1)

这是对先前解决方案的略微修改。我的例子在bash脚本中查找stderr重定向: grep '2>' $(find . -name "*.bash")

答案 5 :(得分:-6)

grep 'search this' *.txt

让我搜索所有.txt文件(当然,输入你自己的搜索值)。