gzip:意外的文件结尾 - 如何读取文件

car*_*ten 12 gzip

我在批处理系统上有一份工作,该系统运行时间非常长并产生大量输出。实际上,我必须通过 gzip 管道传输标准输出,以防止批处理节点填充其工作区并随后崩溃。

longscript | gzip -9 > log.gz
Run Code Online (Sandbox Code Playgroud)

现在,我想在作业仍在运行时调查作业的输出。所以我这样做:

gunzip log.gz
Run Code Online (Sandbox Code Playgroud)

这运行时间很长,因为它是一个巨大的文件(几 GB)。我可以在运行时看到正在创建的输出文件,并且可以在构建时查看它。

tail log
> some-line-of-the-log-file
tail log
> some-other-line-of-the-log-file
Run Code Online (Sandbox Code Playgroud)

但是,最终 gzip 遇到了 gzip 压缩文件的结尾。由于作业仍在运行并且 gzip 仍在写入文件,因此还没有合适的页脚,所以会发生这种情况:

gzip: log.gz: unexpected end of file
Run Code Online (Sandbox Code Playgroud)

在此之后,提取的日志文件被删除,因为 gzip 认为损坏的提取数据对我没有用。然而,我不同意——即使最后几行被打乱了,输出对我来说仍然非常有趣。

如何说服 gzip 让我保留“损坏”的文件?

Kus*_*nda 10

除了文件的最后,您还可以使用zcat(或gzip -dc、 或gunzip -c)查看未压缩的数据:

zcat log.gz | tail
Run Code Online (Sandbox Code Playgroud)

或者

zcat log.gz | less
Run Code Online (Sandbox Code Playgroud)

或者

zless log.gz
Run Code Online (Sandbox Code Playgroud)

gzip出于明显的原因(它需要以块的形式压缩数据)将进行缓冲,因此即使程序可能已经输出了一些数据,该数据可能还没有在log.gz文件中。

您还可以存储未压缩的日志

zcat log.gz > log
Run Code Online (Sandbox Code Playgroud)

...但这会很愚蠢,因为显然你首先压缩输出是有原因的。

  • 对于 `zcat` 仅适用于 `.Z` 文件的系统,请参阅 `gunzip < log.gz` 而不是 `zcat log.gz`。 (2认同)