Come si fa ingresso tubo attraverso grep per un'altra utilità?
Domanda
Sto usando 'tail-f' di seguire un file di log come è aggiornato; dopo mi pipe l'output di quello di grep per mostrare solo le linee 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':
tail -f logfile | grep org.springframework | cut -c 25-
Il comando di taglio sarebbe rimuovere i primi 25 caratteri di ogni riga per me se si potesse ottenere l'input da grep! (Funziona come previsto se elimino 'grep' dalla catena.)
Sto usando Cygwin bash con.
I risultati effettivi:. Quando aggiungo il secondo tubo per la connessione al comando 'tagliare', il risultato è che si blocca, come se fosse in attesa di input (nel caso ve lo stiate chiedendo)
Soluzione
Sul mio sistema, circa 8K fu tamponata prima ho avuto alcun 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
Altri suggerimenti
Supponendo GNU grep, aggiungere --line-buffered
alla riga di comando, ad es.
tail -f logfile | grep --line-buffered org.springframework | cut -c 25-
Modifica
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("")}'
Quello che hai dovrebbe funzionare bene - che è l'idea di condotte. L'unico problema che vedo è che, nella versione del cut
ho (GNU coreutiles 6,10), si dovrebbe usare il cut -c 25-
sintassi (vale a dire utilizzare un segno meno, invece di un segno più) per rimuovere i primi 24 caratteri.
Sei anche alla ricerca di diversi modelli nei tuoi due esempi, nel caso in cui è rilevante.