Extrahieren mehrerer .gz-Dateien und Drucken des Namens der extrahierten Datei

717
Floris

Ich denke, das ist einfach, aber ich blockiere…

Ich habe ein Verzeichnis mit einer Reihe von Protokolldateien (von Minecraft Server…):

2014-09-28-1.log.gz 2014-09-29-1.log.gz 2014-09-30-1.log.gz 2014-10-01-1.log.gz 2014-10-02-1.log.gz latest.log 

Ich möchte das Datum und die Uhrzeit ermitteln, zu denen sich Benutzer angemeldet haben

gzcat *.gz | grep 'logged in' 

Ich bekomme eine Ausgabe wie diese:

[19:26:03] [Server thread/INFO]: Foo[/ip address] logged in with entity id 193955 at (location) [18:26:08] [Server thread/INFO]: Baz[/ip address] logged in with entity id 194873 at (location) [01:16:38] [Server thread/INFO]: User[/ip address] logged in with entity id 198895 at (location) 

usw.

Während ich den Zeitstempel bekomme, bekomme ich leider kein Datum. Im Idealfall wäre die Ausgabe

2014-10-03 19:26:03 Foo logged in 2014-10-04 18:26:08 Baz logged in 2014-10-05 01:16:38 User logged in 

Ich erkenne, dass ich möglicherweise ein awkSkript benötige, um zu dieser "idealen" Ausgabe zu gelangen. Aber gibt es eine Abkürzungslösung (non awk), um nur das Datum zu finden, das mit der Auflistung durchsetzt ist? Etwas wie das:

2014-10-03-1.log.gz [19:26:03] [Server thread/INFO]: Foo[/ip address] logged in with entity id 193955 at (location) 2014-10-04-1.log.gz [18:26:08] [Server thread/INFO]: Baz[/ip address] logged in with entity id 194873 at (location) 2014-10-05-1.log.gz [01:16:38] [Server thread/INFO]: User[/ip address] logged in with entity id 198895 at (location) 

(dh der Name der Datei vor den zurückgegriffenen Bits in jeder Datei) wäre bereits sehr hilfreich.

Beachten Sie, dass in jeder Protokolldatei normalerweise viele andere Einträge vorhanden sind. Es kann mehrere Anmeldungen und andere Meldungen geben (was mich heute nicht interessiert).

In der kürzesten Form wird meine Frage:

Kann ich gzcatden Namen jeder ZIP-Datei ausdrucken, bevor der Inhalt dieser ZIP-Datei zur grepweiteren Verarbeitung übergeben wird?

Ich könnte ein Skript schreiben, um das Ganze zu machen; aber ich suche nach etwas klügerem (ich habe mich gefragt, ob man teevielleicht den Dateinamen druckt stderrund als Argument weitergibt grep, vielleicht.)

0

1 Antwort auf die Frage

2
Srinidhi

Wird dies gzcatvom gzipPaket bereitgestellt ? Auf meinem openSUSE GNU / Linux-Rechner wird die Binärdatei aufgerufen zcat. Wenn gziptatsächlich auf Ihrem Computer installiert ist, sollten Sie auch eine andere Binärdatei aufrufen . Dies zgrepist lediglich ein Shellskript, in dem Dateien stdoutdekomprimiert und aufgerufen werden grep.

zgrepakzeptiert (fast) die gleichen Argumente wie grep. Sie könnten also folgendes tun:

$ zgrep -H 'eingeloggt' * .gz '

Dies gibt die Ausgabe in diesem Format zurück:

2014-10-03-1.log.gz: [19:26:03] [Server-Thread / INFO]: Foo [/ IP-Adresse] ist mit der Entitäts-ID 193955 an (Standort) angemeldet.

Sie können entweder durch .gz:ein Leerzeichen ersetzt werden, indem Sie entweder troder sedetwas an Ihre ideale Leistung bringen .

Das macht die Arbeit sehr gut. Vielen Dank! Ich wusste nicht, dass es einen Befehl gab, der Entpacken und Grep kombinierte, und erlaubte mir, den Dateinamen als Teil der Ausgabe anzugeben - brillant. Herzlichen Glückwunsch zu Ihrer ersten akzeptierten Antwort! Floris vor 9 Jahren 0