Answers:
试试这个小技巧,以哄骗grep
它正在处理多个文件,从而显示文件名:
grep 'pattern' file /dev/null
要获取行号:
grep -n 'pattern' file /dev/null
/dev/null
此命令的意义是什么?
grep
提供了多个文件名,它将在匹配之前自动显示文件名,但是对于单个输入文件,它将保留文件名。通过使用/dev/null
作为一个额外的输入文件grep
“认为”它处理多个文件,但的/ dev / null的当然是空的,所以它不会在比赛列表中显示出来..
-H
grep 的选项不是POSIX的一部分,并且使用的操作系统是Solaris 10,其中标准grep或POSIX兼容版本的grep都不具有该-H
选项。
find . -name foo -exec grep pattern {} \;
-假设foo
您的子目录中有很多文件已命名,find
但仍grep
一次处理一个文件。这个/dev/null
技巧似乎可以在我尝试过的所有linux / osx风格中起作用,所以赞!请注意,我认为这样做-H
比较干净,但是如下所述,您的版本可能不支持它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
打印每个匹配项的文件名。当要搜索多个文件时,这是默认设置。
-n,--line-number
在输出的每一行之前,在其输入文件中添加从1开始的行号。(-n由POSIX指定。)
-H
是GNU扩展,但-n
是由POSIX指定
-H
这里不支持。
没有必要的技巧。
grep --with-filename 'pattern' file
带行号:
grep -n --with-filename 'pattern' file
grep
,所以我也不知道。
brew install grep
然后使用ggrep
。无需修改PATH。
怎么样,我设法实现了这一点,部分归功于这篇文章。
您想在带有模式(例如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
1989年的9.0.5版中对我有用。
find ./path_pattern/to_files -type f -name "files*.log" -exec grep -Hn pattern {} \;
grep --version