Soluzione 1:
Con Unix puoi convogliare l'output di un programma in un altro.
Quindi per filtrare tail, puoi usare grep:
tail -f path | grep your-search-filter
Soluzione 2:
Risposta breve:tail -f somefile | grep somepattern
Tuttavia, questo tende a non essere all'altezza. Supponiamo che tu stia seguendo un file che viene ruotato spesso (se si tratta di un registro di debug, potrebbe essere ruotato più volte). In tal caso tail -F
È tuo amico. Ti lascerò cercare la differenza.
Ma tail -f
e tail -F
stampa prima un mucchio di righe, che spesso è indesiderabile in questo caso d'uso, quindi in questo caso aggiungi -n0
tail -F -n0 somefile | grep somepattern
Andrà bene, fino a quando non vorrai fare qualche altro filtro, e quindi dovrai fare attenzione al buffering. stdout è bufferizzato di riga per impostazione predefinita durante la scrittura su un terminale ma quando è completamente bufferizzato quando si scrive su una pipe. Quindi quanto segue emetterà righe non appena vengono trovate, perché tail
è esplicitamente bufferizzato in linea (o svuota il suo output alla fine di ogni riga), e grep
è anche bufferizzato perché il suo output sta andando al tuo terminale:
tail -F -n0 somefile | grep somepattern
Ma poi decidi di usare qualcosa come awk
o cut
per elaborare ulteriormente l'output.
tail -F -n0 somefile | grep somepattern | awk '{print $3}'
E ora ti chiedi dove sia andato a finire il tuo output... a seconda del volume dei log, potresti scoprire che ottieni output, ma sarà una pagina alla volta perché ora lo stdout di grep
funziona in modo completamente bufferizzato, quindi awk
riceve input 4kB alla volta (per impostazione predefinita).
In questo caso, puoi dire a grep
per rendere sempre bufferizzata la riga stdout utilizzando --line-buffered
opzione.
tail -F -n0 somefile | grep --line-buffered somepattern | ...
Tuttavia, la maggior parte dei comandi non ha un analogo di --line-buffered
. Nel caso di strumenti più scriptabili, puoi utilizzare una funzione per svuotare l'output (ad es. in awk
, la funzione è fflush()
, che condivide lo stesso nome della sua controparte C, strumenti come Perl e Python hanno qualcosa di simile).
Con artisti del calibro di cut
probabilmente sei sfortunato; ... ma potresti provare a cercare unbuffer
, che penso sia qualcosa fornito dal expect
toolchain (non l'ho mai usato).
Spero che tu l'abbia trovato utile.
Saluti, Cameron
Soluzione 3:
e puoi utilizzare più pipe e grep ed escludere cose con grep -v, ottenere l'insensibilità tra maiuscole e minuscole con grep -i, ecc.
es.:tail -100f /var/log/messages | grep -V ACPI | grep -i ata
inizia a seguire 100 righe dalla fine e continua a seguire, prima escludi tutte le righe con ACPI, quindi mostra le righe con ata, ATA o qualsiasi combinazione di queste.
Un'altra opzione utile sono le opzioni ABC, per le righe After, Before e Context (righe prima e dopo).