如何从多个文件grep该特定文件的结果的行号
问题描述:
我试图使用grep输出多个文件的结果的行号。如何从多个文件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
。
我该如何做到这一点?
答
Grep只能看到一连串的线条,无法知道文件何时结束以及新文件何时开始,因此它不知道每个文件的行编号。
相反管道gunzip
输出到grep的,您可以直接使用zgrep
:
$ 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
谢谢本杰明! –