Подтвердить что ты не робот

Разделение gzipped лог файлов без сохранения разрыхленных разделов на диске

У меня есть повторяющаяся задача разбить набор больших (около 1-2 гигабайт каждый) gzipped логфайлов Apache на несколько частей (например, куски 500K строк). Окончательные файлы должны быть снова скопированы для ограничения использования диска.

В Linux я бы обычно делал:

zcat biglogfile.gz | split -l500000

Результирующие файлы файлов будут называться xaa, xab, xac и т.д. Поэтому я:

gzip x*

Эффект этого метода заключается в том, что в качестве промежуточного результата эти огромные файлы временно сохраняются на диске. Есть ли способ избежать использования этого промежуточного диска?

Могу ли я (каким-то образом, как это делают xargs) разделить канал на выход через команду (например, gzip) и повторно сжимать вывод на лету? Или я смотрю в неправильном направлении и есть ли лучший способ сделать это?

Спасибо.

4b9b3361

Ответ 1

Вы можете использовать опцию split --filter, как описано в руководстве, например.

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

Редактировать: не известно, когда была введена опция --filter, но, согласно комментариям, она не работает в core utils 8.4.

Ответ 2

A script, как это может быть достаточно.

#!/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

Здесь zipsplit, но использует алгоритм zip в отличие от алгоритма gzip.