Zcat ve kediyi şeffaf bir şekilde birleştiren bir araç var mı?


70

Günlük dosyalarını işlerken, bazıları gziplenmiş dosya olarak sonlanır, logrotatediğerleri değildir. Yani böyle bir şey denediğinizde:

$ zcat *

gibi bir komut satırı ile bitmek zcat xyz.log xyz.log.1 xyz.log.2.gz xyz.log.3.gzve sonra:

gzip: xyz.log: not in gzip format

Çıktısını örneğin boruya aktarabilmem için, nasıl kullanılacağına benzer şekilde sihirli baytları alacak fileve kullanacak zcatveya catsonuçlara göre bir araç var mı grep?

Not: Ben kod yazabileceğimi biliyorum, ama zaten orada bir araç olup olmadığını soruyorum.

Yanıtlar:


41

zless

Yazık görünüyor zcat, çünkü libz hem sıkıştırılmış hem de sıkıştırılmamış dosyalardan şeffaf bir şekilde okumayı destekleyen bir API'ye sahip. Ancak manpage zcatbunun eşdeğer olduğunu söylüyor gunzip -c.


Bu alternatif için teşekkür ederim. Bunu düşünebilirdim, değil mi? ;) ... Oh iyi. Spot, +1 ve kabul et (ayrıca diğer cevaplayıcıdan daha az temsilcisin olduğundan).
0xC0000022L 27:13

İnanılmaz. Bana çok yardımcı oldu, bunu yıllarca çözmek için kabuk betiği kullanıyordum ... ya da korkunç bir perl betiği ... log atstats tarafından kullanılan birleştirme sorununu çözdüm ... şimdi bu şaşırtıcı aracı biliyorum. Teşekkürler.
Luciano Andress Martini

98

-fVeya ile deneyin --force:

zcat -f -- *

Çünkü zcatsadece çalışan basit bir script

exec gzip -cd "$@"

tercüme edecek uzun seçeneklerle

exec gzip --stdout --decompress "$@"

ve man gzip(benimkini vurgula) uyarınca :

-f --force
      Dosyada birden çok bağlantı olsa bile sıkıştırmayı veya sıkıştırmayı açmayı zorla
      veya ilgili dosya zaten mevcutsa veya sıkıştırılmış veri
      bir terminale okunan veya yazılmış. Giriş verileri bir biçimde değilse
      gzip tarafından tanınır ve --stdout seçeneği de verilirse,
      Standart çıktıya değiştirmeden girdi verisi: zcat 'in kedi gibi davranmasını sağlayın .

Ayrıca:

böylece çıktıyı grepörneğin boruya aktarabilirim

Bunun için kullanabilirsiniz zgrep:

zgrep -- PATTERN *

Yine de Stéphane'nin yorumuna bakınız.


1
Teşekkürler, bu zlessçözüme ilginç bir alternatif . Güzel ve +1.
0xC0000022L

6
Her iki unutmayın zlessve zgrepdiyorsunuz komut dosyaları gzip -cdfq(yani zcat -fq).
Stéphane Chazelas 28:13

9

Ben de aynı amaç için kullanıyorum:

{ cat /var/log/messages ; zcat /var/log/messages*.gz ; }| grep something | grep "something else" ....

Bu yaklaşımı seviyorum çünkü meslektaşları eğitmek için en az zaman harcanması gerekiyor. Günlük mesajları sıralama dostu bir zaman damgasında bir zaman damgasına sahipse, bu özellikle yararlıdır.
Thomas L Holaday

Mükemmel yaklaşım Teşekkürler.
Miloš Đakonović

7

Tüm dekompresyon araçlarını arka uçtan bağımsız olarak birleştiren zutils adı verilen ztooller (zcat, zgrep, ..) için bir değiştirme işlemi var. Böylece aynı komutla düz, lzma, gzipped, xz dosyalarını şeffaf bir şekilde okuyabilirsiniz.

Debian wheezy veya daha yeni, muhtemelen redhat / centos da mevcuttur.

Projenin sayfası burada nongnu.org

Buradaki kullanımın kullanımını açıklayan bir blog yazısı ( noone.org )


3

Bu, zcat'in ikili olduğu RHEL 5.x'te gayet iyi çalışır. Zel'in bir betik olduğu RHEL 6.x'te (ve Ubuntu 12.x) başarısız olur. Bu kullanılan ince çalışmak.

Ben hiç zcat kullanmıyordum ama zgrep de sıkıştırılmamış dosyaları düzgün bir şekilde işlemiyor.


2

Hem sıkıştırılmış hem de sıkıştırılmamış, kronolojik sırayla açılır.

ls -v syslog* | tac | xargs zcat -f | less

Ondan fazla günlük dosyasıyla yanlış düzen veriyor (syslog.10.gz ...)
Vanni

İyi yakalama. -v bunu düzeltmeli.
Ryan,

ls -rvönlemek için tac. Günlük dosyaları için, less $(ls -rv syslog*)sizin ile LESSOPENenv var set düzgün iyi çalışıyor. esc-nDosya sınırlarını göz ardı ederek bir sonraki eşleşmeyi bulmak için dosyalar arasında arama yapabilirsiniz .
Peter Cordes

İle zsh:zcat -f syslog*(nOn)
Stéphane Chazelas 10:17

Günlük döndürme ertesi gün sıkıştırmak için ayarlanmışsa bu işe yaramaz
cjbarth

1

Sarıcı ne olacak?

$ cat xcat.sh 
#!/bin/bash

for i in $@;do 
        [ ! -z "$(file -i $i | grep "gzip")" ] && zcat $i || cat $i
done

$ bash xcat.sh plain.txt gzipped_text.gz

0

~/.bashrcBu bash işlevini kopyalayıp yapıştırın (veya dosyanızı sonuna yerleştirin ) :

logs() { zcat -f $(ls -rv "$1"*) | less; }

Şimdi örneğin yazabilirsiniz logs /var/log/syslogveya logs /var/log/nginx/access.loggörmek tüm syslog veya nginx ile eskiden yeniye doğru günlük iletilerini az .

Daha sonra yazarak ve bir sonraki için isabet bir şey arayabilirsiniz ./somethingn


0

Tam olarak bunu yaparken güzel bir perl betiği var. Awstats projesinden logresolvemerge.pl: http://www.awstats.org/docs/awstats_tools.html

Logresolvemerge, tarihe göre sıralanmış ve belirli kaynaklardan üretilmiş tek bir benzersiz çıktı günlük dosyası elde etmenizi sağlar:

  • Birkaç giriş günlüğü dosyalarını okuyabilir
  • .Gz / .bz2 log dosyalarını okuyabilir

    Çıktı STDOUT'dadır, böylece ek işlemlerde oldukça hoş bir şekilde yararlanabilirsiniz.


  • 0

    @ Ryan'ın cevabını temel alarak aşağıdakiler, tüm 'haddelenmiş' dosyaları alfabetik olarak sıraladıktan sonra geçerli dosyayı alacak, gerektiğinde onları açacak ve lessonları açacaktır :

    cat <(ls mylog.log-* | sort) <(ls mylog.log) | xargs zcat -f | less

    veya hepsini sürekli bir akış olarak almak istiyorsanız, tailbunları yapabilirsiniz ve isteğe bağlı olarak başka bir işleme yönlendirin

    cat <(ls mylog.log-* | sort | xargs zcat -f) <(tail -f -n +0 mylog.log)

    Bunun, dosyanın sonuna eklenen tarihle günlük olarak döndürülen günlükler için tasarlandığını not etmeliyim. Eğer bize farklı bir formatta giriş yaparsa, catbildirimin ilk bölümünü uyum sağlamak için değiştirmeniz gerekecektir .

    Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
    Licensed under cc by-sa 3.0 with attribution required.