分割gzip日志文件,而不将未解压缩的分割存储在磁盘上

我有一个反复的任务,将一组大的(每个大约1-2吉比特)gzip的Apache日志文件分成几个部分(比如说500K行)。 最后的文件应该再次压缩以限制磁盘的使用。

在Linux上我通常会这样做:

zcat biglogfile.gz | split -l500000 

生成的文件将被命名为xaa,xab,xac等。所以我这样做:

 gzip x* 

这种方法的效果是,作为一个中间结果,这些巨大的文件被临时存储在磁盘上。 有没有办法避免这种中间磁盘使用?

我可以(以类似于xargs的方式)通过命令(如gzip)将输出分开pipe道,并重新压缩输出? 还是我看错了方向,有没有更好的方法来做到这一点?

谢谢。

Solutions Collecting From Web of "分割gzip日志文件,而不将未解压缩的分割存储在磁盘上"

您可以使用slpit –filter选项,如手册中所述

 zcat biglogfile.gz | split -l500000 --filter='gzip > $FILE.gz' 

编辑:不知道什么时候 – --filter选项被引入,但根据意见,它不是在core utils 8.4

像下面的脚本可能就足够了。

 #!/usr/bin/perl use PerlIO::gzip; $filename = 'out'; $limit = 500000; $fileno = 1; $line = 0; while (<>) { if (!$fh || $line >= $limit) { open $fh, '>:gzip', "$filename_$fileno"; $fileno++; $line = 0; } print $fh $_; $line++; } 

有zipsplit ,但使用zip算法,而不是gzip算法。