如何让grep
在输出中的匹配行之前显示文件名?
答案 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扩展程序,但-n
是specified 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文件(当然,输入你自己的搜索值)。