2010-10-18 10 views
10

Bir parça büyük (yaklaşık 1-2 GiB) gzipli Apache günlük dosyalarını birkaç parçaya bölme (500K satırlı parçalar) yineleyen bir görevim var. Disk kullanımını sınırlamak için son dosyalar tekrar gzipli olmalıdır.Diskte ungzipli bölmeleri saklamadan gziplenmiş günlük dosyaları bölme

Linux'ta normalde yapacağını:

zcat biglogfile.gz | split -l500000 

yüzden yapmak dosyalar Xaa, xab, XAC isimlendirilecek çıkan dosyalar, vb:

gzip x* 

Bu yöntemin etkisi Ara sonuç olarak bu büyük dosyaları geçici olarak diskte saklanır. Bu ara disk kullanımını önlemek için bir yolu var mı?

Ben (xargs'in yaptığı gibi) çıktıyı bir komutla (gzip gibi) bölme borusuna bölebilir ve çıktıyı anında yeniden sıkıştırır mı? Yoksa yanlış yöne bakıyorum ve bunu yapmanın daha iyi bir yolu var mı?

Teşekkürler.

+0

Biçimlendirilmiş dosyalara satırları doğrudan yazabildiğiniz bir betik dilinde bölünmüş stil işlevselliğini uygulamaya bakacağım. –

cevap

18

Sen slpit --filter seçeneğini kullanabilirsiniz

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

Düzenleme: --filter seçenek tanıtıldı ama yorumlara göre, bu core utils 8.4 çalışan değilken farkında değildir.

+1

Teşekkürler. Bence bu tür bir işlemi yapmak için tasarlanan bölünmüş bir özelliği kullanmak her zaman evdeki koddan daha iyidir. –

+2

çok güzel ama dikkat çekirdim coreutils 8.4 bir 'filter' argumnet – zach

+0

yok teşekkürler @zach Ben cevap güncellendi – jimkont

-1

zipsplit var, ancak bu zip algoritmasını gzip algoritmasının aksine kullanır.

3

Aşağıdaki gibi bir komut yeterli olabilir. the manual örneğin açıklandığı gibi

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

Teşekkürler, hızlı örneğiniz bana çok yardımcı oldu. İki küçük düzeltmelerle (ilk satır #!/Ile başlamalı ve $ fileno ++'dan sonra ek bir $ satır = 0'a ihtiyaç duyulmalıdır) amaçlarınız için yeterince iyi çalıştı. –

+0

Teşekkürler. Bunları bütünlük için senaryoya ekledim. –