我正在尝试使用grep输出多个文件的结果行号。
示例:
文件1的名称是test1.zip
;在test1.zip
内,内容为
123
234
文件2的名称是test2.zip
;在test2.zip
内,内容为
456
789
现在,这只是一个简化的场景。在实际场景中,我有多个这样的文件。
现在,我正在这样做:
gunzip -c test* | grep -n 789
结果是
4;789
但我想看到的是
2;789
因为789是其自己文件中的第二行,test2.zip
。
我怎样才能做到这一点?
答案 0 :(得分:1)
Grep只看到一行线,无法知道文件何时结束并且新文件何时开始,因此它不知道每个文件的行编号。
您可以直接使用gunzip
,而不是将zgrep
的输出汇总到grep:
$ zgrep -n 789 test*
test2.gz:2:789
如果您没有zgrep
,则可以find
使用-exec
,如下所示:
$ find -name 'test*' -exec bash -c 'gunzip -c "$1" | grep -n 789 ' _ {} \;
2:789
这将找到与test*
匹配的所有文件,并在其上运行您的管道。将管道引入find -exec
的方法是使用bash -c 'command' _ {}
生成子shell,然后将command
中的文件名称为$1
。
这确实为您提供了所要求的结果,但如果您还想要文件名,则可以在-exec
成功退出时打印:
$ find -name 'test*' -exec bash -c 'gunzip -c "$1" | grep -n 789 ' _ {} \; -print
2:789
./test2.gz