2009-06-09 5 views
26

Sto usando 'tail -f' per seguire un file di log man mano che viene aggiornato; successivamente ho reindirizzato l'output di that a grep per mostrare solo le righe contenenti un termine di ricerca ("org.springframework" in questo caso); finalmente mi piacerebbe fare è il piping dell'output da grep ad un terzo comando, 'tagliato':Come si può reindirizzare l'input attraverso grep a un'altra utility?

tail -f logfile | grep org.springframework | cut -c 25- 

Il comando taglio sarebbe rimuovere i primi 25 caratteri di ogni riga per me se si potrebbe ottenere l'ingresso da grep! (Funziona come previsto se elimini 'grep' dalla catena.)

Sto usando cygwin con bash.

Risultati effettivi: quando aggiungo il secondo tubo per connettersi al comando "taglia", il risultato è che si blocca, come se fosse in attesa di input (nel caso ve lo stessero chiedendo).

+0

Se mi fermo dopo grep (senza il tubo per 'tagliare') , funziona (senza rimuovere i primi 24 o 25 caratteri). – les2

+0

Il vero problema qui è che 'tail -f' non finisce mai, quindi il resto della pipeline continua ad aspettare ulteriori input – Hasturkun

risposta

10

Sul mio sistema, circa 8K è stato memorizzato nel buffer prima di ottenere qualsiasi output. Questa sequenza ha lavorato a seguire il file immediatamente:

tail -f logfile | while read line ; do echo "$line"| grep 'org.springframework'|cut -c 25- ; done 
+0

è appena tornato a questo e questo ha funzionato – les2

-1

Quello che devi funzionare correttamente è l'intera idea di condutture. L'unico problema che vedo è che nella versione di cut ho (GNU coreutiles 6.10), dovresti usare la sintassi cut -c 25- (ad esempio, utilizzare un segno meno invece di un segno più) per rimuovere i primi 24 caratteri.

Sei anche alla ricerca di modelli diversi nei due esempi, nel caso sia pertinente.

+0

oops! sto usando il segno "meno" - quello era un errore di battitura nel mio post qui – les2

29

Supponendo GNU grep, aggiungi --line-buffered alla riga di comando, ad es.

tail -f logfile | grep --line-buffered org.springframework | cut -c 25- 

Edit:

vedo grep buffer non è l'unico problema qui, come tagliare non consente formato da linee buffering.

si potrebbe desiderare di provare a sostituire con qualcosa che si può controllare, come ad esempio sed:

tail -f logfile | sed -u -n -e '/org\.springframework/ s/\(.\{0,25\}\).*$/\1/p' 

o awk

tail -f logfile | awk '/org\.springframework/ {print substr($0, 0, 25);fflush("")}' 
+1

- il buffer in linea non ha funzionato per me - che bufferizza l'* output * di grep. Se si esegue tail -f logfile | cut -c 25-, rimane solo lì. Il buffering viene eseguito sull'output di tail. –

+0

Revisionato, sembra che tu sia stato morso dal buffer di stdout in cut, questi dovrebbero funzionare per te – Hasturkun

+0

Grazie! questo è veramente utile quando esegui il pipe-chaining di greps multipli. per esempio. someprogwithoutput | grep --line-buffered filterpattern | grep --color highlightpattern – Superole