如何让grep在其输出中的匹配行之前显示文件名?
grep
试试这个小技巧,让grep认为它正在处理多个文件,这样它就会显示文件名:
grep 'pattern' file /dev/null
也可以得到行号:
grep -n 'pattern' file /dev/null
如果你有选项-H和-n可用(man grep是你的朋友):
-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, with-filename
打印每个匹配项的文件名。当有时,这是默认值 一个以上的文件 搜索。< / p >
- n,行编号
在输出的每一行前面加上以1为基础的行号 输入文件。(- n是 由POSIX指定)
-H是一个GNU扩展,但是-n是由POSIX指定
这个怎么样,我成功地实现了,在一定程度上,感谢这篇文章。
filename=logfile.DATE
/logsapp1, /logsapp2
"init time"
find ./logsapp* -name logfile* | xargs -I{} grep "init time" {} \dev\null | tee outputfilename.txt
那么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命令将基于该模式搜索文件名
find
然后,管道xargs -I{}将把find输出重定向到{}
xargs -I{}
{}
这将是grep ""pattern" {}的输入
grep ""pattern" {}
然后使grep显示文件名\dev\null的技巧
\dev\null
最后,用tee outputfile.txt将输出写入文件
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
grep '2>' $(find . -name "*.bash")