代码之家  ›  专栏  ›  技术社区  ›  Niels Basjes

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

  •  10
  • Niels Basjes  · 技术社区  · 14 年前

    我有一个经常性的任务,就是将一组大的(每个大约1-2 GiB)gzip Apache日志文件分成几个部分(比如500K行的块)。最后的文件应该再次gzip以限制磁盘使用。

    在Linux上,我通常会:

    zcat biglogfile.gz | split -l500000
    

    所以我要:

    gzip x*
    

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

    或者我是不是看错了方向,有没有更好的办法?

    谢谢。

    3 回复  |  直到 14 年前
        1
  •  21
  •   Nick Chammas    5 年前

    你可以使用 split --filter 选项,如中所述 the manual

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

    编辑:不知道何时 --filter 选项已引入,但根据注释,它在 core utils 8.4 .

        2
  •  3
  •   user7610    10 年前

    像下面这样的脚本就足够了。

    #!/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++;
    }
    
        3
  •  -1
  •   Tony Miller    14 年前

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