如何从多个文件中 grep 该特定文件的结果的行号

  • 本文关键字:文件 结果 grep 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.

我怎样才能做到这一点?

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

相关内容

  • 没有找到相关文章

最新更新