Разделение gzipped лог файлов без сохранения разрыхленных разделов на диске
У меня есть повторяющаяся задача разбить набор больших (около 1-2 гигабайт каждый) gzipped логфайлов Apache на несколько частей (например, куски 500K строк). Окончательные файлы должны быть снова скопированы для ограничения использования диска.
В Linux я бы обычно делал:
zcat biglogfile.gz | split -l500000
Результирующие файлы файлов будут называться xaa, xab, xac и т.д.
Поэтому я:
gzip x*
Эффект этого метода заключается в том, что в качестве промежуточного результата эти огромные файлы временно сохраняются на диске. Есть ли способ избежать использования этого промежуточного диска?
Могу ли я (каким-то образом, как это делают xargs) разделить канал на выход через команду (например, gzip) и повторно сжимать вывод на лету?
Или я смотрю в неправильном направлении и есть ли лучший способ сделать это?
Спасибо.
Ответы
Ответ 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.