2012-12-13 4 views
16

Andando con un tipico log di accesso Apache, è possibile eseguire:Piping uscita coda se grep due volte

tail -f access_log | grep "127.0.0.1" 

che non farà che vi mostrerà i log (come vengono creati) per l'indirizzo IP specificato.

Ma perché questo non riesce quando lo si pipe anche se grep una seconda volta, per limitare ulteriormente i risultati?

Ad esempio, un semplice esclude per "css":

tail -f access_log | grep "127.0.0.1" | grep -v ".css" 

non mostrerà alcun output.

+0

Vedi anche [doppia grep su tail -f non fornisce alcuna uscita] (http: //unix.stackexchange.com/a/164681/20661) – rubo77

risposta

31

Credo che il problema qui sia che il primo grep sta eseguendo il buffering dell'output, il che significa che il secondo grep non lo vedrà fino a quando il buffer non verrà scaricato.

Prova ad aggiungere l'opzione --line-buffered sul vostro primo grep:

tail -f access_log | grep --line-buffered "127.0.0.1" | grep -v ".css" 

Per ulteriori informazioni, vedere "BashFAQ/009 -- What is buffering? Or, why does my command line produce no output: tail -f logfile | grep 'foo bar' | awk ..."

10

Questo è il risultato di buffering, finirà per stampa quando siano disponibili dati sufficienti.

Utilizzare l'opzione --line-buffered come suggerito dal Shawn Chin o se stdbuf è disponibile, è possibile ottenere lo stesso effetto con:

tail -f access_log | stdbuf -oL grep "127.0.0.1" | grep -v ".css" 
+0

Grazie Thor, anche tu hai ragione, ma penso che Shawn sia arrivato li prima di te. –