È possibile fare un tail -f
(o simile) su un file, e grep
allo stesso tempo? Non mi dispiacerebbe altri comandi solo alla ricerca di quel tipo di comportamento.
È possibile fare un tail -f
(o simile) su un file, e grep
allo stesso tempo? Non mi dispiacerebbe altri comandi solo alla ricerca di quel tipo di comportamento.
Risposte:
Funzionerà benissimo; più in generale, grep
attenderà quando un programma non viene emesso e continuerà a leggere quando arriva l'output, quindi se lo fai:
$ (echo foo; sleep 5; echo test; sleep 5) | grep test
Non succederà nulla per 5 secondi, quindi grep emetterà il "test" corrispondente, e poi dopo cinque secondi uscirà quando il processo di piping lo fa
Aggiungi --line-buffered
a grep
e ciò potrebbe ridurre il ritardo per te. Molto utile in alcuni casi.
tail -f foo | grep --line-buffered bar
grep
non va su un terminale (reindirizzato a un altro tipo di file). il buffering di linea è l'impostazione predefinita quando l'uscita va su un terminale, quindi non farà alcuna differenza lì. Nota che questa opzione è specifica per GNU.
Puoi semplicemente reindirizzare l'output di grep
intail -f
. Esistono anche programmi che combinano tail -f
funzionalità con filtri e colorazioni, in particolare multitail ( esempi ).
Vedo tutte queste persone che dicono di usare tail -f
, ma non mi piacciono i limiti! Il mio metodo preferito di ricerca di un file mentre cerco anche nuove linee (ad esempio, lavoro comunemente con i file di registro a cui viene aggiunto l'output reindirizzato di processi eseguiti periodicamente tramite cron job):
tail -Fn+0 /path/to/file|grep searchterm
Questo presuppone GNU tail e grep. Dettagli di supporto dalla manpage tail (GNU coreutils, mine is v8.22) [ https://www.gnu.org/software/coreutils/manual/coreutils.html] :
-F same as --follow=name --retry -n, --lines=K output the last K lines, instead of the last 10; or use -n +K to output starting with the Kth. If the first character of K (the number of bytes or lines) is a '+', print beginning with the Kth item from the start of each file, otherwise, print the last K items in the file. K may have a multiplier suffix: b 512, kB 1000, K 1024, MB 1000*1000, M 1024*1024, GB 1000*1000*1000, G 1024*1024*1024, and so on for T, P, E, Z, Y. With --follow (-f), tail defaults to following the file descriptor, which means that even if a tail'ed file is renamed, tail will continue to track its end. This default behavior is not desirable when you really want to track the actual name of the file, not the file descriptor (e.g., log rotation). Use --follow=name in that case. That causes tail to track the named file in a way that accommodates renaming, removal and creation.
Quindi, la parte di coda del mio comando equivale a tail --follow --retry --lines=+0
, dove l'argomento finale indica che inizia all'inizio, saltando zero linee.
tail -f access | awk '/ADD/{print $0}'
Usa quanto sopra, lo uso di solito.
Puoi usare netcat per visualizzare i risultati di tail -f mentre i nuovi risultati arrivano abbastanza facilmente.
sudo nc -s localhost -l -p 1337 | grep ssh
tail -f /var/log/file.log | nc 127.0.0.1 1337
Questo imposta grep per ascoltare i risultati per l'input proveniente dalla porta 1337.
Il secondo comando indirizza l'output di tail -f a netcat e lo invia localhost 1337. Per farlo localmente è necessario cambiare ttys per ciascuno dei due set di comandi o usa qualcosa come lo schermo.
Funziona. Ma attenzione che l'output non è più istantaneo: viene bufferizzato attraverso la pipe.
tail -f
in una finestra e tail -f logfile | grep pattern
nell'altra finestra. Le righe contenenti pattern
non vengono sempre visualizzate contemporaneamente in entrambe le finestre. Ho visto le linee apparire a 30 secondi di distanza in rare occasioni, il che era fastidioso.
tee
o qualcosa del genere.