阅读gzip压缩文本文件的最后几行

taw*_*taw 14 gzip

假设file.txt.gz有2GB,我想看到最后100行左右.zcat <file.txt.gz | tail -n 100会经历所有这些.

我知道压缩文件不能随机访问,如果我剪切让我们说它的最后5MB,那么剪切后的数据将是垃圾 - 但是可以gzip重新同步并解码其余的流吗?

如果我理解正确,gzip流是一个简单的命令流,描述输出什么 - 应该可以与之同步.然后是最近未压缩​​数据的32kB滑动窗口 - 如果我们从中间开始当然是垃圾,但我猜它通常会快速填充真实数据,从那时起减压是微不足道的(好吧,从文件的开始到结束,一些东西可能会一遍又一遍地被重新复制,因此滑动窗口永远不会清除 - 如果它只是常见的话会让我感到惊讶 - 如果发生这种情况,我们只需要处理整个文件.

我不是非常渴望自己做这个gzip hackery的亲戚 - 以前没有人做过,因为处理损坏的文件,如果没有别的?

或者 - 如果gzip真的不能这样做,是否有任何其他流压缩程序可以像它一样工作,除了它们允许重新同步中流?

编辑:我发现zlib的纯Ruby重新实现,并在浏览窗口内打印它以打印字节数.事实证明事情确实会被反复复制很多,即使在5MB以后,滑动窗口仍然包含来自前100个字节的内容,以及整个文件中的随机位置.

我们甚至无法通过读取前几个块和最后几个块来解决这个问题,因为那些第一个字节没有被直接引用,它只是一个非常长的副本链,并且找出它所指的内容的唯一方法是通过处理这一切.

基本上,使用默认选项我想要的可能是不可能的.

另一方面,zlib具有Z_FULL_FLUSH清除此滑动窗口以进行同步的选项.所以问题仍然存在.假设zlib偶尔同步,是否有任何工具可以读取它的结尾而不处理它?

bro*_*ool 1

Z_FULL_FLUSH 发出可用于同步的已知字节序列 (00 00 FF FF)。 此链接可能有用。