linux - vita - tail grep log file




Come 'grep' un flusso continuo? (8)

Attiva la modalità di buffering di riga di grep quando usi gred BSD (FreeBSD, Mac OS X ecc.)

tail -f file | grep --line-buffered my_pattern

Non hai bisogno di farlo per GNU grep (usato praticamente su qualsiasi Linux) poiché verrà svuotato di default (YMMV per altri like di Unix come SmartOS, AIX o QNX).

È possibile utilizzare grep su un flusso continuo?

Quello che intendo è un comando tail -f <file> , ma con grep sull'output per mantenere solo le righe che mi interessano.

Ho provato tail -f <file> | grep pattern tail -f <file> | grep pattern ma sembra che grep possa essere eseguito solo una volta che la tail finisce, cioè mai.


Io uso la tail -f <file> | grep <pattern> tail -f <file> | grep <pattern> tutto il tempo.

Aspetterà fino a quando grep arriverà, non prima che finisca (sto usando Ubuntu).


Non ho visto nessuno offrire il mio solito go-to per questo:

tail -F <fileName> | grep --line-buffered  <pattern> -A 3 -B 5

Io preferisco questo, perché puoi usare ctrl + c per fermarti e navigare nel file ogni volta, e poi premere shift + f per tornare alla ricerca live streaming.


Penso che il tuo problema sia che grep usa un buffer di output. Provare

tail -f file | stdbuf -o0 grep my_pattern

imposterà la modalità buffer di output di grep su unbuffered.


Sì, funzionerà davvero bene. Grep e la maggior parte dei comandi Unix operano su flussi una riga alla volta. Ogni linea che esce dalla coda verrà analizzata e trasmessa se corrisponde.


Se vuoi trovare le corrispondenze nell'intero file (non solo la coda) e vuoi che si sieda e aspetti nuove corrispondenze, funziona bene:

tail -c +0 -f <file> | grep --line-buffered <pattern>

La bandiera -c +0 dice che l'output dovrebbe iniziare 0 byte ( -c ) dall'inizio ( + ) del file.


potresti considerare questa risposta come un miglioramento .. di solito sto usando

less +F <file>
ctrl + c
/<search term>
<enter>
shift + f

-F è migliore in caso di rotazione del file (-f non funziona correttamente se il file viene ruotato)

-A e -B è utile per ottenere linee appena prima e dopo l'occorrenza del modello .. questi blocchi verranno visualizzati tra i separatori di linee tratteggiate


sed sarebbe il comando corretto (editor di stream )

tail -n0 -f <file> | sed -n '/search string/p'

e poi se volevi che il comando tail uscisse quando hai trovato una stringa particolare:

tail --pid=$(($BASHPID+1)) -n0 -f <file> | sed -n '/search string/{p; q}'

Ovviamente un bashismo: $ BASHPID sarà l'id di processo del comando tail. Il comando sed è il prossimo dopo tail nella pipe, quindi l'id del processo sed sarà $ BASHPID + 1.





tail