Ottenere l'ultima partita in un file usando grep


58

Qual è il modo migliore per ottenere solo la corrispondenza finale di un'espressione regolare in un file usando grep?

Inoltre, è possibile iniziare il grepping dalla fine del file anziché dall'inizio e fermarsi quando trova la prima corrispondenza?

Risposte:


85

Potresti provare

grep pattern file | tail -1

o

tac file | grep pattern | head -1

o

tac file | grep -m1 pattern

20
tac file | grep -m 1 pattern
Dennis Williamson,

1
Con il vincolo aggiunto che volevo ottenere il numero di riga ( grep -n) nel file reale, penso che dovessi tacpraticamente evitare, a meno che non volessi fare qualche sottrazione con wc -l. In caso contrario, taccon grep -m1fa un sacco di senso.
Nick Merrill,

1
Mi piacerebbe vedere una versione più performante di questa, dal momento che sto cercando di cercare un file da 20 GB.
Jeff,

La risposta di @DennisWilliamson è molto migliore perché grepsmetterà di funzionare dopo la prima partita. senza -m 1, grepprima troverà tutti i modelli corrispondenti nel file , quindi headmostrerà solo il primo - molto meno efficiente. Dennis, ti preghiamo di considerare di postare questo in una risposta separata!
Gilad Maya

1

Per chi lavora con enormi file di testo in Unix / Linux / Mac / Cygwin. Se usi Windows dai un'occhiata agli strumenti Linux in Windows: https://stackoverflow.com/questions/3519738/what-is-the-best-way-to-use-linux-utilities-under-windows .

Si può seguire questo flusso di lavoro per avere buone prestazioni:

  1. comprimere con gzip
  2. usa zindex (su github: https://github.com/mattgodbolt/zindex ) per indicizzare il file con la chiave appropriata
  3. interroga il file indicizzato con zqdal pacchetto.

Citazione dal suo readme github:

Creare un indice

zindex deve essere informato su quale parte di ogni riga costituisce l'indice. Questo può essere fatto da un'espressione regolare, per campo o eseguendo il piping di ogni riga attraverso un programma esterno.

Per impostazione predefinita zindex crea un indice di file.gz.zindex quando viene richiesto di indicizzare file.gz.

Esempio:

creare un indice su righe corrispondenti a un'espressione regolare numerica. Il gruppo di acquisizione indica la parte da indicizzare e le opzioni mostrano che ogni riga ha un indice numerico univoco.

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

Esempio: creare un indice sul secondo campo di un file CSV:

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

Esempio:

creare un indice su un campo JSON orderId.id in uno qualsiasi degli elementi dell'array di azioni della radice del documento (richiede jq). La query jq crea un array di tutti orderId.ids, quindi li unisce con uno spazio per garantire che ogni singola riga inviata a jq crei una singola riga di output, con più corrispondenze separate da spazi (che è il separatore predefinito).

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

Interrogazione dell'indice

Il programma zq viene utilizzato per interrogare un indice. Viene fornito il nome del file compresso e un elenco di query. Per esempio:

$ zq file.gz 1023 4443 554 

È anche possibile eseguire l'output per numero di riga, quindi per stampare le righe 1 e 1000 da un file:

$ zq file.gz --line 1 1000

1

Uso sempre cat (ma questo lo rende un po 'più lungo): cat file | grep pattern | tail -1

Darei la colpa al mio insegnante di corso di amministrazione linux al college che ama i gatti :))))

- Non devi cercare un file prima di estrarlo. grep pattern file | tail -1ed è anche più efficiente.


6
Questa è solo la prima parte della risposta di Cakemox, se non peggio.
agosto

Funziona, ma fa passi inutili. Per un uso leggero, questa soluzione funziona bene, ma non funziona bene. Il motivo è perché non è necessario catil file e reindirizzarlo grep. Puoi grepcercare il file direttamente tramite grep pattern file(e quindi utilizzare tailper restituire l'ultimo risultato), come nella risposta di Cakemox.
jvriesem,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.