Разделение сжатых лог-файлов без сохранения распакованных разделений на диске - PullRequest
10 голосов
/ 18 октября 2010

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

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

zcat biglogfile.gz | split -l500000

Полученные файлы будут называться xaa, xab, xac и т. Д. Итак, я делаю:

gzip x*

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

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

Спасибо.

Ответы [ 3 ]

20 голосов
/ 10 июля 2014

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

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

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

3 голосов
/ 18 октября 2010

Сценария, подобного следующему, может быть достаточно.

#!/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++;
}
0 голосов
/ 18 октября 2010

Существует zipsplit , но в нем используется алгоритм zip, а не алгоритм gzip.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...