如何让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 打印每个匹配的文件名。当有时,这是默认值 一个以上的文件 搜索。 - 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{}将查找输出重定向到{}
这将是grep ""pattern"{}的输入
然后是使grep显示文件名\dev\null的技巧
最后,用tee outputfile.txt将输出写入文件
这在1989年的grep 9.0.5版本中为我工作。
不需要什么技巧。
grep --with-filename 'pattern' file
带行号:
grep -n --with-filename 'pattern' file