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

ter*_*don 7 command-line shell compression

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

for i in *; do zcat "$i" | tail -n3; done
Run Code Online (Sandbox Code Playgroud)

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

for i in *; do tail -n 30 "$i" | gunzip | tail -n 4 ; done
Run Code Online (Sandbox Code Playgroud)

或者

for i in *; do tac "$i" | head -100 | gunzip | tac | tail -n3; done
Run Code Online (Sandbox Code Playgroud)

但双方都抱怨:

gzip: stdin: not in gzip format
Run Code Online (Sandbox Code Playgroud)

我认为那是因为我缺少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
Run Code Online (Sandbox Code Playgroud)

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

Rad*_*bík 7

正如已经说过的那样,如果文件已使用标准gzip. 如果您可以控制压缩,则可以使用dictzip压缩文件,它将文件压缩在单独的块中,您可以仅解压缩最后一个块(通常为 64KB)。并且它向后兼容gzip,这意味着 dictzipped 文件也是完全合法的 gzipped 文件。

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


cir*_*eos 5

好吧,如果您之前为每个文件创建了索引,则可以随机访问一个 gzip文件...

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

https://github.com/circulosmeos/gztool

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

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

该工具基于原始 zlib 的 zran.c 演示代码,因此没有超出规则的魔法!