如何解压缩并打印压缩文本文件的最后几行?

如何解压缩并打印压缩文本文件的最后几行?

我有 6 个 gzip 压缩文本文件,每个文件压缩后约为 17G。我需要查看每个文件的最后几行(解压缩)以检查是否存在特定问题。明显的方法非常慢:

for i in *; do zcat "$i" | tail -n3; done

我想我可以做一些聪明的事情,比如:

for i in *; do tail -n 30 "$i" | gunzip | tail -n 4 ; done

或者

for i in *; do tac "$i" | head -100 | gunzip | tac | tail -n3; done

但两人都抱怨:

gzip: stdin: not in gzip format

我认为这是因为我缺少gzip标题,但这也失败了:

$ aa=$(head -c 300 file.gz)
$ bb=$(tail -c 300 file.gz)
$ printf '%s%s' "$aa" "$bb" | gunzip
gzip: stdin: unexpected end of file

我真正要找的是ztailorztac但我认为它们不存在。谁能想出一个聪明的技巧,让我解压缩并打印压缩文件的最后几行,而无需解压缩整个文件?

答案1

你不能,因为它已经说过了,如果文件已使用标准gzip.如果您可以控制压缩,则可以使用dictzip要压缩文件,它将文件压缩为单独的块,您可以仅解压缩最后一个块(通常为 64KB)。而且它向后兼容gzip,这意味着 dictzip 压缩文件也是完全合法的 gzip 压缩文件。

另一种可能性是,如果您将 gzip 压缩文件作为多个已 gzip 压缩文件的串联获得,则可以搜索最后一个 gzip 签名并解压缩之后的所有内容。

答案2

出色地,你可以如果您之前创建了一个,则随机访问一个 gzip 压缩文件指数对于每个文件...

我开发了您可能正在寻找的命令行工具:它可以使用与gunzip相同的时间访问尾部...但是因为它创建了一个小(<<1%/gzip)索引,下次提取将会非常快:

https://github.com/circulosmeos/gztool

该工具有两个您可能感兴趣的选项:

  • -S选项监督仍在增长的文件并在其增长时为其创建索引 - 这对于 gzip 压缩的 rsyslog 文件非常有用,因为在实践中将创建索引的时间减少到零。
  • -ttails一个gzip文件:这样你可以这样做:$ gztool -t foo.gz 请注意,如果索引不存在,这将消耗与完全解压相同的时间:但由于索引是可重用的,下次搜索的时间将大大减少 -既然是同时,为什么不使用它并同时创建索引呢?

该工具基于来自原始 zlib 的 zran.c 演示代码,所以不存在不符合规则的魔法!

相关内容