Come ‘grep’ un stream continuo?

È ansible utilizzare grep su un stream continuo?

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

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

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).

Io uso la tail -f | grep tail -f | grep tutto il tempo.

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

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.

Nella maggior parte dei casi, puoi tail -f /var/log/some.log |grep foo e funzionerà perfettamente.

Se è necessario utilizzare più greps su un file di registro in esecuzione e si scopre che non si ottiene alcun output, potrebbe essere necessario --line-buffered l’ --line-buffered in mezzo grep (s), in questo modo:

 tail -f /var/log/some.log | grep --line-buffered foo | grep bar 

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  | grep --line-buffered  

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

 tail -F  | grep --line-buffered  -A 3 -B 5 

-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

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

 less +F  ctrl + c /  shift + f 

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.

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.

sed sarebbe il comando corretto (editor di stream )

tail -n0 -f | 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 | 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.

Usa awk (un’altra grande utilità di bash) invece di grep in cui non hai l’opzione bufferizzata di linea! Trasmetterà continuamente i tuoi dati dalla coda.

questo è il modo in cui usi grep

 tail -f  | grep pattern 

Questo è il modo in cui useresti awk

 tail -f  | awk '/pattern/{print $0}'