语境
假设我有两个文件a.txt
和b.txt
一些内容......
$ tail *.txt
==> a.txt <==
ABC
CDE
123
C
==> b.txt <==
C
321
EDC
CBA
让我们也想象一下,这些文件现在已经被放入一个 gzip 压缩包中......
$ tar -czf tarball.tgz *.txt
$ tar -tf tarball.tgz
a.txt
b.txt
目标
现在,我想通过 tarball 中的文件 grep。在比赛前看到原始文件名和行号会很好,但我最重要的是想看到匹配的行。
我尝试了什么?
首先,我预计这zgrep 'pattern' tarball.tgz
会简单地工作。它确实告诉我是否有匹配,它甚至可以计算它们,但我找不到打印匹配的方法......
$ zgrep 'AB' tarball.tgz
Binary file (standard input) matches
$ zgrep 'C' tarball.tgz
Binary file (standard input) matches
$ zgrep -c 'AB' tarball.tgz
1
$ zgrep -c 'C' tarball.tgz
6
其次,我想到zcat
了 tarball 并在其上使用常规 grep。但是,我仍然收到完全相同的“二进制文件(标准输入)匹配”消息...
$ zcat tarball.tgz | grep 'C'
Binary file (standard input) matches
我猜zcat
(和zgrep
)做gunzip
但没有tar -xf
?如果我看一下,zcat
我可以看到与刚刚完成的输出相同的输出tar -c
......
$ zcat tarball.tgz
a.txt0000664�3���3���0000000001613554050266013370 0ustar useruserABC
CDE
123
C
b.txt0000664�3���3���0000000001613554050301013357 0ustar useruserC
321
EDC
CBA
$ tar -c *.txt
a.txt0000664�3���3���0000000001613554050266013370 0ustar useruserABC
CDE
123
C
b.txt0000664�3���3���0000000001613554050301013357 0ustar useruserC
321
EDC
CBA
所以最后,我得到了这个工作正常的解决方案:
$ tar -xOzf tarball.tgz | grep 'C'
ABC
CDE
C
C
EDC
CBA
当然,如果我现在询问文件名和行号,我没有得到任何有用的信息......
$ tar -xOzf tarball.tgz | grep -Hn 'C'
(standard input):1:ABC
(standard input):2:CDE
(standard input):4:C
(standard input):5:C
(standard input):7:EDC
(standard input):8:CBA
我能想到的唯一方法是获得我想要的结果,需要更多的脚本来提取压缩包并grep
循环运行......
有没有一种很好(简单而简洁)的方法来做到这一点?