Frage Mit grep die letzte Übereinstimmung in einer Datei abrufen


Was ist der beste Weg, um nur die letzte Übereinstimmung eines regulären Ausdrucks in einer Datei mit grep zu erhalten?

Ist es auch möglich, mit grepping vom Ende der Datei anstatt vom Anfang zu beginnen und zu stoppen, wenn die erste Übereinstimmung gefunden wird?


43
2017-11-01 23:26


Ursprung




Antworten:


Du könntest es versuchen

grep pattern file | tail -1

oder

tac file | grep pattern | head -1

oder

tac file | grep -m1 pattern

66
2017-11-01 23:33



tac file | grep -m 1 pattern - Dennis Williamson
Mit der zusätzlichen Einschränkung, dass ich die Zeilennummer bekommen wollte (grep -n) in der eigentlichen Datei, denke ich tac ziemlich viel musste vermieden werden, es sei denn, ich wollte etwas subtrahieren wc -l. Andernfalls tac mit grep -m1 macht sehr viel Sinn. - Nick Merrill
Ich würde gerne eine performantere Version sehen, da ich versuche, eine 20-GB-Datei zu durchsuchen. - Jeff
@DennisWilliamson's Antwort ist viel besser, weil grep wird nach dem ersten Spiel aufhören zu arbeiten. ohne -m 1, grep wird zuerst Finde alle passenden Muster in der Datei, dann head wird nur die erste zeigen - viel weniger effizient. Dennis, bitte erwäge, dies in einer separaten Antwort zu veröffentlichen! - gilad mayani


Ich benutze immer Katze (aber das macht es ein wenig länger): cat file | grep pattern | tail -1

Ich würde meinem Linux Admin Kurslehrer an der Uni die Schuld geben, die Katzen liebt :))))

- Sie müssen erst eine Datei cattern, bevor Sie sie überschreiben. grep pattern file | tail -1 und ist auch effizienter.


1
2017-11-02 01:45



Dies ist nur der erste Teil von Cakemox's Antwort, außer schlimmer. - augurar


Für jemanden, der mit riesigen Textdateien unter Unix / Linux / Mac / Cygwin arbeitet. Wenn Sie Windows verwenden, überprüfen Sie dies in Windows über Linux-Tools: https://stackoverflow.com/questions/3519738/what-is-the-best-way-to-use-linux-utilities-under-windows.

Man kann diesem Workflow folgen, um eine gute Leistung zu erzielen:

  1. mit gzip komprimieren
  2. benutze zindex (auf github:      https://github.com/mattgodbolt/zindex) um die Datei zu indexieren     passender Schlüssel
  3. Abfrage der indizierten Datei mit zq aus dem Paket.

Zitat aus seiner Github-Readme:

Erstellen eines Indexes

zindex muss angegeben werden, welcher Teil jeder Zeile den Index darstellt.   Dies kann durch einen regulären Ausdruck, durch ein Feld oder durch jeweils ein Piping erfolgen   Linie durch ein externes Programm.

Standardmäßig erstellt zindex einen Index von file.gz.zindex, wenn Sie dazu aufgefordert werden   Indexdatei.gz.

Beispiel:

Erstellen Sie einen Index für Linien, die einem numerischen regulären entsprechen   Ausdruck. Die Erfassungsgruppe gibt den Teil an, der indexiert werden soll.   und die Optionen zeigen, dass jede Zeile einen eindeutigen numerischen Index hat.

$ zindex file.gz --regex 'id:([0-9]+)' --numeric --unique

Beispiel:   Erstellen Sie einen Index für das zweite Feld einer CSV-Datei:

$ zindex file.gz --delimiter , --field 2 

Beispiel:

Erstellen Sie einen Index für a   JSON-Feld orderId.id in einem der Elemente im Stammverzeichnis des Dokuments   Aktions-Array (benötigt jq). Die jq-Abfrage erstellt ein Array aller   orderId.ids, verbindet sie dann mit einem Leerzeichen, um sicherzustellen, dass jede Person   Linie piped zu jq erstellt eine einzige Zeile der Ausgabe, mit mehreren   Übereinstimmungen, die durch Leerzeichen getrennt sind (das ist das Standardtrennzeichen).

$ zindex file.gz --pipe "jq --raw-output --unbuffered '[.actions[].orderId.id] | join(\" \")'" 

Den Index abfragen

Das zq-Programm wird verwendet, um einen Index abzufragen. Es hat den Namen des   komprimierte Datei und eine Liste von Abfragen. Zum Beispiel:

$ zq file.gz 1023 4443 554 

Es ist auch möglich, nach Zeilen auszugeben   Nummer, um Zeilen 1 und 1000 aus einer Datei zu drucken:

$ zq file.gz --line 1 1000

0
2017-10-03 07:39