Gibt es ein Tool, das zcat und cat transparent kombiniert?

70

Bei der Verarbeitung von Protokolldateien werden einige dank logrotateund andere nicht als komprimierte Dateien ausgegeben . Also, wenn Sie so etwas versuchen:

$ zcat *

Sie erhalten eine Befehlszeile wie zcat xyz.log xyz.log.1 xyz.log.2.gz xyz.log.3.gzund dann mit:

gzip: xyz.log: not in gzip format

Gibt es ein Tool, das die magischen Bytes annimmt, ähnlich wie es filefunktioniert, und verwendet zcatoder catabhängig vom Ergebnis, damit ich die Ausgabe zum grepBeispiel weiterleiten kann ?

NB: Ich weiß, dass ich es schreiben kann, aber ich frage, ob es da draußen schon ein Tool gibt.

0xC0000022L
quelle

Antworten:

41

zless

Schade zcat, denn libz hat eine API, die das transparente Lesen von komprimierten und nicht komprimierten Dateien unterstützt. Aber die Manpage sagt, das zcatist äquivalent zu gunzip -c.

sourcejedi
quelle
Vielen Dank für diese Alternative. Daran hätte ich denken können, nicht wahr? ;) ... Naja. Spot on, +1 und akzeptiere (auch weil du weniger Wiederholungen hast als der andere Antwortende).
0xC0000022L
Tolle. Hat mir sehr geholfen, ich habe jahrelang Shell-Skripte verwendet, um das zu lösen ... oder ein schreckliches Perl-Skript ... log resolve merge, das von awstats verwendet wird ... jetzt kenne ich dieses erstaunliche Tool. Vielen Dank.
Luciano Andress Martini
98

Probieren Sie es mit -foder --force:

zcat -f -- *

Da zcatist nur ein einfaches Skript, das läuft

exec gzip -cd "$@"

mit langen Optionen, die übersetzt werden würden

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

und nach der man gzip(betonen meine):

-f --force
      Komprimierung oder Dekomprimierung erzwingen, auch wenn die Datei mehrere Verknüpfungen enthält
      oder die entsprechende Datei existiert bereits, oder wenn die Daten komprimiert sind
      Aus einem Terminal lesen oder in ein Terminal schreiben. Wenn die Eingabedaten nicht in einem Format vorliegen
      wird von gzip erkannt, und wenn die Option --stdout ebenfalls angegeben ist, kopieren Sie die
      Eingabedaten ohne Änderung der Standardausgabe: Lassen Sie zcat sich wie cat verhalten .

Ebenfalls:

damit ich den ausgang zum grepbeispiel weiterleiten kann

Sie könnten dafür verwenden zgrep:

zgrep -- PATTERN *

siehe jedoch Stéphanes Kommentar unten.

don_crissti
quelle
1
Danke, das ist eine interessante Alternative zur zlessLösung. Schön und +1.
0xC0000022L
6
Beachten Sie, dass beide zlessund zgrepSkripte sind , die rufen Sie gzip -cdfq(dh zcat -fq).
Stéphane Chazelas
9

Ich benutze genau für den gleichen Zweck:

{ cat /var/log/messages ; zcat /var/log/messages*.gz ; }| grep something | grep "something else" ....
Washuu
quelle
Ich mag diesen Ansatz, weil er die geringste Zeit erfordert, die für die Ausbildung von Mitarbeitern aufgewendet wird. Wenn die Protokollnachrichten einen Zeitstempel in einem sortierfreundlichen Zeitstempel haben, ist dies besonders nützlich.
Thomas L Holaday
Hervorragender Ansatz. Vielen Dank.
Miloš Đakonović
7

Es gibt einen Drop-In-Ersatz für ztools (zcat, zgrep, ..) namens zutils, der alle Dekomprimierungswerkzeuge unabhängig vom Backend vereint. Mit dem gleichen Befehl können Sie Klartext-, LZMA-, GZIP- und XZ-Dateien transparent lesen.

Es ist in debian wheezy oder neuer verfügbar, wahrscheinlich auch in redhat / centos.

Die Seite des Projekts ist hier nongnu.org

Ein Blog-Beitrag, der die Verwendung des Dienstprogramms hier erklärt ( noone.org )

Folgen
quelle
3

Dies funktioniert gut in RHEL 5.x, wo zcat eine Binärdatei ist. In RHEL 6.x (und Ubuntu 12.x), wo zcat ein Skript ist, schlägt dies fehl. Das hat früher gut funktioniert.

Ich würde zcat überhaupt nicht verwenden, aber auch nicht komprimierte Dateien werden von zgrep nicht richtig verarbeitet.

Peter Laws
quelle
2

Öffnet sowohl komprimierte als auch nicht komprimierte Dateien in chronologischer Reihenfolge.

ls -v syslog* | tac | xargs zcat -f | less
Ryan
quelle
Es gibt falsche Reihenfolge mit mehr als zehn Protokolldateien (syslog.10.gz ...)
Vanni
Guter Fang. -v sollte das beheben.
Ryan
ls -rvzu vermeiden tac. Für die Logdateien less $(ls -rv syslog*)mit Ihrem LESSOPENenv var gut eingestellt funktioniert. Sie können Dateien mit durchsuchen esc-n, um die nächste Übereinstimmung zu finden, wobei die Dateigrenzen ignoriert werden.
Peter Cordes
Mit zsh:zcat -f syslog*(nOn)
Stéphane Chazelas
Dies funktioniert nicht, wenn Sie Ihre Protokollrotation so eingestellt haben, dass sie am nächsten Tag komprimiert wird
cjbarth,
1

Was ist mit Wrapper?

$ 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
Verbergen
quelle
0

Kopieren Sie ~/.bashrcdiese Bash- Funktion und fügen Sie sie ein (oder fügen Sie sie am Ende Ihrer Datei ein) :

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

Jetzt können Sie zum Beispiel eingeben logs /var/log/syslogoder logs /var/log/nginx/access.logum zu sehen , alle die syslog oder nginx Protokollmeldungen vom ältesten bis zum neuesten mit weniger .

Anschließend können Sie suchen etwas tippen /somethingund schlagen nfür nächste .

Vanni
quelle
0

Es gibt ein wunderschönes Perl-Skript, das genau das tut. Es ist logresolvemerge.pl aus dem awstats-Projekt: http://www.awstats.org/docs/awstats_tools.html

Mit Logresolvemerge können Sie eine eindeutige Ausgabeprotokolldatei abrufen, die nach Datum sortiert ist und aus bestimmten Quellen erstellt wurde:

  • Es können mehrere Eingabeprotokolldateien gelesen werden
  • Es kann GZ / BZ2-Protokolldateien lesen

    Die Ausgabe erfolgt auf STDOUT, sodass Sie sie in zusätzlichen Prozessen recht gut verwenden können.

  • Daniel Andersen
    quelle
    0

    Aufbauend auf der Antwort von @ Ryan werden im Folgenden alle "gerollten" Dateien alphabetisch sortiert und anschließend die aktuelle Datei abgerufen und bei Bedarf lessdekomprimiert.

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

    Wenn Sie sie alle als kontinuierlichen Stream erhalten möchten, können Sie tailsie verwenden und optional an einen anderen Prozess weiterleiten

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

    Ich sollte beachten, dass dies für Protokolle gedacht ist, die täglich mit dem Datum gedreht werden, das an das Ende der Datei angehängt wird. Wenn Ihre Protokolle ein anderes Format aufweisen, müssen Sie den ersten Teil der catAnweisung entsprechend ändern .

    cjbarth
    quelle