Scr*_*zer 414
尝试这个小技巧来哄骗grep
它认为它处理多个文件,以便它显示文件名:
grep 'pattern' file /dev/null
Run Code Online (Sandbox Code Playgroud)
要获得行号:
grep -n 'pattern' file /dev/null
Run Code Online (Sandbox Code Playgroud)
Chr*_*our 281
如果你有选择-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
Run Code Online (Sandbox Code Playgroud)
选项:
-H, - with-filename
打印每个匹配的文件名.当有多个要搜索的文件时,这是默认设置.
-n, - line-number
在输入文件中使用基于1的行号为每行输出添加前缀.(-n由POSIX指定.)
-H
可能是GNU扩展,但-n
由POSIX指定.
MD *_* XF 43
没有必要的技巧.
grep --with-filename 'pattern' file
Run Code Online (Sandbox Code Playgroud)
使用行号:
grep -n --with-filename 'pattern' file
Run Code Online (Sandbox Code Playgroud)
小智 5
怎么样,我设法实现了这一点,部分归功于这篇文章。
您想filename=logfile.DATE
在几个带有模式(例如/logsapp1, /logsapp2
)的目录中找到多个文件,比方说名称不同但带有模式(例如)的日志。每个文件都有一个您想grep的模式(例如"init time"
),并且您想拥有"init time"
每个文件的模式,但要知道它属于哪个文件。
find ./logsapp* -name logfile* | xargs -I{} grep "init time" {} \dev\null | tee outputfilename.txt
Run Code Online (Sandbox Code Playgroud)
然后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
Run Code Online (Sandbox Code Playgroud)
一般来说
find ./path_pattern/to_files* -name filename_pattern* | xargs -I{} grep "grep_pattern" {} \dev\null | tee outfilename.txt
Run Code Online (Sandbox Code Playgroud)
说明:
find
命令将根据模式搜索文件名
然后,管道xargs -I{}
会将find
输出重定向到{}
这将是输入 grep ""pattern" {}
然后grep
显示文件名的技巧\dev\null
最后,将输出写入文件 tee outputfile.txt
这在grep
1989年的9.0.5版中对我有用。
归档时间: |
|
查看次数: |
320435 次 |
最近记录: |