320

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

4

6 回答 6

477

尝试这个小技巧来哄骗grep它认为它正在处理多个文件,以便它显示文件名:

grep 'pattern' file /dev/null

还要获取行号:

grep -n 'pattern' file /dev/null
于 2013-03-15T12:38:23.930 回答
339

如果您有选择-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 扩展,但-nPOSIX 指定

于 2013-03-15T12:41:41.817 回答
52

没有必要的伎俩。

grep --with-filename 'pattern' file

带行号:

grep -n --with-filename 'pattern' file
于 2017-02-24T22:42:04.350 回答
6

怎么样,我设法实现了这一点,部分归功于这篇文章。

您想在多个具有模式(例如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

这在grep9.0.5 版本 1989 中对我有用。

于 2015-10-22T16:35:24.667 回答
1

这是对先前解决方案的轻微修改。我的示例在 bash 脚本中查找 stderr 重定向: grep '2>' $(find . -name "*.bash")

于 2017-03-02T19:44:48.620 回答
-7
grep 'search this' *.txt

帮助我搜索所有 .txt 文件(当然,输入您自己的搜索值)。

于 2016-03-28T23:57:25.890 回答