在匹配行之前显示文件名

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

394096 次浏览

试试这个小技巧,让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

打印每个匹配项的文件名。当有时,这是默认值 一个以上的文件 搜索。< / p >

- n,行编号

在输出的每一行前面加上以1为基础的行号 输入文件。(- n是 由POSIX指定)

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

这个怎么样,我成功地实现了,在一定程度上,感谢这篇文章。

你想要找到几个文件,假设有不同名称但有一个模式(例如filename=logfile.DATE)的日志,在几个有一个模式(例如/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命令将基于该模式搜索文件名

然后,管道xargs -I{}将把find输出重定向到{}

这将是grep ""pattern" {}的输入

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

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

这在grep version 9.0.5 build 1989中为我工作。

grep 'search this' *.txt

对我来说,搜索所有的.txt文件很有用(当然,输入你自己的搜索值)。

不需要什么技巧。

grep --with-filename 'pattern' file

带行号:

grep -n --with-filename 'pattern' file
这是对之前解决方案的轻微修改。我的例子在bash脚本中寻找stderr重定向: grep '2>' $(find . -name "*.bash") < / p >