Czy istnieje narzędzie, które w przejrzysty sposób łączy Zcat i Cat?


70

Podczas obsługi plików dziennika niektóre kończą się jako pliki spakowane gzip, logrotatea inne nie. Więc kiedy spróbujesz czegoś takiego:

$ zcat *

kończy się wiersz poleceń, zcat xyz.log xyz.log.1 xyz.log.2.gz xyz.log.3.gza następnie:

gzip: xyz.log: not in gzip format

Czy istnieje narzędzie, które pobierze bajty magiczne, podobne do tego file, jak działa, i użyje zcatlub w catzależności od wyniku, aby grepna przykład przesłać dane wyjściowe ?

NB: Wiem, że mogę to napisać, ale pytam, czy istnieje już jakieś narzędzie.

Odpowiedzi:


41

zless

Szkoda zcat, bo libz ma interfejs API, który obsługuje przezroczyste odczytywanie zarówno skompresowanych, jak i nieskompresowanych plików. Ale strona twierdzi, że zcatjest to równoważne z gunzip -c.


Dziękuję za tę alternatywę. Mogłem o tym pomyśleć, prawda? ;) ... No cóż. Wykryj, +1 i zaakceptuj (również dlatego, że masz mniej powtórzeń niż inny odpowiadający).
0xC0000022L

Niesamowity. Bardzo mi pomogło, używałem skryptu powłoki, aby rozwiązać to przez lata ... lub strasznego skryptu perla ... scalanie logów, używane przez awstats ... teraz znam to niesamowite narzędzie. Dzięki.
Luciano Andress Martini

98

Wypróbuj z -flub --force:

zcat -f -- *

Ponieważ zcatjest to tylko prosty skrypt, który działa

exec gzip -cd "$@"

z długimi opcjami, które by się przełożyły

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

i zgodnie z man gzip(podkreśl moje):

-f --force
      Wymuś kompresję lub dekompresję, nawet jeśli plik ma wiele łączy
      lub odpowiedni plik już istnieje, lub jeśli skompresowane dane to
      odczytać lub zapisać na terminalu. Jeśli dane wejściowe nie są w formacie
      rozpoznawane przez gzip, a jeśli podano także opcję --stdout, skopiuj plik
      dane wejściowe bez zmiany standardowego wyjścia: niech zcat zachowuje się jak cat .

Również:

żebym mógł grepna przykład przesłać dane wyjściowe

Możesz użyć zgrepdo tego:

zgrep -- PATTERN *

choć patrz komentarz Stéphane poniżej.


1
Dzięki, to ciekawa alternatywa dla zlessrozwiązania. Fajnie i +1.
0xC0000022L

6
Należy zauważyć, że zarówno zlessi zgrepsą skrypty, które nie nazywają gzip -cdfq(to znaczy zcat -fq).
Stéphane Chazelas

9

Używam dokładnie w tym samym celu:

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

Podoba mi się to podejście, ponieważ wymaga najmniej czasu poświęcanego na edukację współpracowników. Jeśli komunikaty dziennika zawierają znacznik czasu w znaczniku czasu przyjaznym dla sortowania, jest to szczególnie przydatne.
Thomas L Holaday

Doskonałe podejście. Dzięki.
Miloš Đakonović

7

Istnieje zastąpienie ztools (zcat, zgrep, ..) zwane zutils, które łączy wszystkie narzędzia dekompresyjne niezależnie od backendu. Tak więc za pomocą tego samego polecenia możesz odczytywać pliki zwykłe, lzma, gzipped, xz.

Jest dostępny w wersji debian wheezy lub nowszej, prawdopodobnie także w wersji redhat / centos.

Strona projektu znajduje się tutaj nongnu.org

Wpis na blogu wyjaśniający wykorzystanie util tutaj ( noone.org )


3

Działa to dobrze w RHEL 5.x, gdzie Zcat jest plikiem binarnym. Nie działa w RHEL 6.x (i Ubuntu 12.x), gdzie zcat jest skryptem. To kiedyś działało dobrze.

W ogóle nie używałbym Zcat, ale zgrep również nie będzie poprawnie obsługiwał nieskompresowanych plików.


2

Otwiera zarówno skompresowane, jak i nieskompresowane, w kolejności chronologicznej.

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

Daje niewłaściwą kolejność dla więcej niż dziesięciu plików dziennika (syslog.10.gz ...)
Vanni

Dobry chwyt -v powinien to naprawić.
Ryan

ls -rvaby uniknąć tac. Dla plików dziennika, less $(ls -rv syslog*)ze swoją LESSOPENustawić env var prawidłowo działa dobrze. Możesz wyszukiwać w plikach, esc-naby znaleźć następne dopasowanie, ignorując granice plików.
Peter Cordes,

Z zsh:zcat -f syslog*(nOn)
Stéphane Chazelas,

Nie działa to, jeśli masz ustawiony obrót dziennika do kompresji następnego dnia
cjbarth

1

Co powiesz na opakowanie?

$ 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

Skopiuj i wklej (lub umieść na końcu ~/.bashrcpliku) tę funkcję bash :

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

Teraz można wpisać na przykład logs /var/log/sysloglub logs /var/log/nginx/access.logzobaczyć wszystkie te syslog lub nginx wiadomości dziennika od najstarszego do najnowszego z mniej .

Następnie możesz wyszukać coś, wpisując /somethingi naciskając nw następnej kolejności .


0

Dokładnie to robi piękny skrypt perla. Jest to logresolvemerge.pl z projektu awstats: http://www.awstats.org/docs/awstats_tools.html

Logresolvemerge pozwala uzyskać jeden unikalny wyjściowy plik dziennika, posortowany według daty, zbudowany z określonych źródeł:

  • Może odczytać kilka wejściowych plików dziennika
  • Może odczytywać pliki dziennika .gz / .bz2

    Dane wyjściowe są w STDOUT, dzięki czemu można je całkiem dobrze wykorzystać w dodatkowych procesach.


  • 0

    Opierając się na odpowiedzi @ Ryana, następujące zostaną pobrane wszystkie „zwinięte” pliki posortowane alfabetycznie, a następnie pobierz bieżący plik, w razie potrzeby rozpakuj go, a lessnastępnie:

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

    lub jeśli chcesz uzyskać je wszystkie jako ciągły strumień, możesz tailje i opcjonalnie potokować to do innego procesu

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

    Powinienem zauważyć, że jest to przeznaczone dla dzienników, które są obracane codziennie z datą dołączaną na końcu pliku. Jeśli logujesz nam inny format, musisz zmodyfikować pierwszą część catinstrukcji, aby uwzględnić.

    Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
    Licensed under cc by-sa 3.0 with attribution required.