如何grep
在其输出中的匹配行之前显示文件名?
6 回答
尝试这个小技巧来哄骗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-文件名
打印每个匹配的文件名。当有多个文件要搜索时,这是默认设置。
-n,--行号
在其输入文件中使用从 1 开始的行号为每行输出添加前缀。(-n 由 POSIX 指定。)
-H
是 GNU 扩展,但-n
由POSIX 指定
没有必要的伎俩。
grep --with-filename 'pattern' file
带行号:
grep -n --with-filename 'pattern' file
怎么样,我设法实现了这一点,部分归功于这篇文章。
您想在多个具有模式(例如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
9.0.5 版本 1989 中对我有用。
这是对先前解决方案的轻微修改。我的示例在 bash 脚本中查找 stderr 重定向:
grep '2>' $(find . -name "*.bash")
grep 'search this' *.txt
帮助我搜索所有 .txt 文件(当然,输入您自己的搜索值)。