grep e tail -f?


28

È possibile fare un tail -f(o simile) su un file, e grepallo stesso tempo? Non mi dispiacerebbe altri comandi solo alla ricerca di quel tipo di comportamento.

Risposte:


46

Usando GNU taile GNU grep, sono in grado di grep a tail -fusando la sintassi diretta:

tail -f /var/log/file.log | grep search_term

Questa è una soluzione che funziona con altre implementazioni di queste due utility, non solo con l'implementazione GNU.
Kusalananda

7

Funzionerà benissimo; più in generale, grepattenderà 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


7

Aggiungi --line-buffereda grepe ciò potrebbe ridurre il ritardo per te. Molto utile in alcuni casi.

tail -f foo | grep --line-buffered bar

2
È utile quando l'output di grepnon 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.
Stéphane Chazelas,


2

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.


1
tail -f access | awk '/ADD/{print $0}'

Usa quanto sopra, lo uso di solito.


0

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.


0

Funziona. Ma attenzione che l'output non è più istantaneo: viene bufferizzato attraverso la pipe.


Concordato. Per provare questo, aprire due finestre. Esegui tail -fin una finestra e tail -f logfile | grep patternnell'altra finestra. Le righe contenenti patternnon 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.
Stefan Lasiewski,

Ciò potrebbe avere più a che fare con il sistema che passa tra l'esecuzione dell'una o l'altra istanza di tail. Un test migliore sarebbe noi teeo qualcosa del genere.
Kevin Cantu,
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.