如何从多个文件

时间:2017-05-31 15:19:02

标签: linux unix grep gunzip

我正在尝试使用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

我怎样才能做到这一点?

1 个答案:

答案 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