coda un file di registro ma mostra solo linee specifiche


29

Sto eseguendo la coda di un file di registro con -f flag. Quindi sto eseguendo il piping per grep, per trovare solo le righe che contengono "X". Funziona perfettamente. Ora voglio reindirizzare questo in un altro grep, che rimuoverà tutte le linee contenenti "Y". Quando aggiungo la seconda pipe, il file smette di aggiornarsi e sembra che non ci siano dati in arrivo.

Questo è il comando che funziona: tail -f my_file.log | grep "X"

Questo è il comando che non: tail -f my_file.log | grep "X" | grep -v "Y"

Come dovrei strutturarlo in modo che il comando funzioni?


1
prova a fare una pipe per una pipe, cambia la sequenza, fai tail -f file|grep -v "Y". se l'output è ok, procedere con l'appendice grep "X".
Aizuddin Zali,

Risposte:


38

Poiché l'output di grepè bufferizzato, utilizzare l' --line-bufferedopzione di grepper abilitare il buffering di riga:

tail -f /path/to/log | grep --line-buffered 'X' | grep -v 'Y'

Se il tuo grepnon ha l'opzione, puoi usare stdbufcome alternativa:

tail -f /path/to/log | stdbuf -oL grep 'X' | grep -v 'Y'

1
Mi chiedo come stdbufdice libstdbuf.soquali impostazioni utilizzare.
Kasperd,

@kasperd: variabili di ambiente.
Nate Eldredge,

1
@NateEldredge Ho già cercato variabili d'ambiente nell'output diff -u <(env) <(stdbuf env)e non ne ho trovate. Ma ora mi rendo conto che quello che avrei dovuto testare era diff -u <(env) <(stdbuf -oL env).
Kasperd,

Sono anche lo stesso tipo di problema. nel mio caso, devo stampare tutte le righe che contengono "aaa" e "bbb". Sopra la prima soluzione non funziona. La seconda soluzione funziona perché "aaa" esiste e "bbb" non esiste. entrambi esistono non funzionanti. non dà output. il mio comando è simile al seguente: tail -f test.txt | stdbuf -oL grep 'aaa' | grep 'bbb' non fornisce alcun output. Per favore potete aiutarmi.
Dom

18

Normalmente trovo più utile awkper questo tipo di controlli logici:

tail -f /path/to/log | awk '/X/ && !/Y/'
#                           ^^^    ^^^^
#                   this I want    but not this

Testato avendo due schede, una in cui continuo a scrivere seq 20 >> myfilee l'altra ad esempio tail -f myfile | awk '/3/ && !/13/'.


15

Un altro approccio sarebbe quello di utilizzare una sola grepchiamata invece di due e quindi evitare il problema del buffering. Usa solo espressioni regolari che corrispondano a righe costituite da 0 o più caratteri non Y, quindi una X e quindi 0 o più caratteri non Y fino alla fine della riga "

tail -f /path/to/log | grep '^[^Y]*X[^Y]*$'
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.