gzip:带有-文件的意外结尾-无论如何如何读取文件


9

我在一个批处理系统上工作,该批处理系统运行时间极长,并产生大量产出。实际上,我不得不通过gzip传递标准输出,以防止批处理节点填充其工作区并随后崩溃。

longscript | gzip -9 > log.gz

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

gunzip log.gz

由于它是大文件(几个GB),因此运行时间非常长。我可以看到输出文件在运行时正在创建,并且可以在生成文件时对其进行查看。

tail log
> some-line-of-the-log-file
tail log
> some-other-line-of-the-log-file

但是,最终,gzip遇到gzip压缩文件的结尾。由于作业仍在运行,并且gzip仍在写入文件,因此尚无适当的页脚,因此会发生以下情况:

gzip: log.gz: unexpected end of file

此后,提取的日志文件将被删除,因为gzip认为损坏的提取数据对我没有用。但是,我不同意-即使最后两行都乱码了,输出对我还是很有趣的。

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


gunzip -c将输出写入stdout ...也许这就是您想要的?它保持原始不变。
bretonics

Answers:


5

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

zcat log.gz | tail

要么

zcat log.gz | less

要么

zless log.gz

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

您也可以将未压缩的日志与

zcat log.gz > log

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


1
gunzip < log.gz的,而不是zcat log.gz对系统中zcat只适用于.Z文件。
斯特凡Chazelas

1

如果我理解正确,则您希望tail -f对仍在增长的gzip文件执行以下操作:我开发了gztool可以做到这一点(除其他功能外):

$ gztool -T log.gz

它将连续输出到控制台,并在必要时等待新数据。

请注意,这gztool还将创建一个索引文件(log.gzi在这种情况下),该索引文件将使将来的尾巴或其他gztool几乎几乎瞬时的对gzip数据的随机访问。如果不想创建索引(即使索引大小为0.3%/ gzip,并且不增加处理时间),则可以使用-W不创建索引。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.