Perché non viene mostrato alcun output quando si usa grep due volte?

Fondamentalmente mi sto chiedendo perché questo non produce nulla:

tail --follow=name file.txt | grep something | grep something_else 

Si può presumere che dovrebbe produrre output Ho eseguito un’altra riga per confermare

 cat file.txt | grep something | grep something_else 

Sembra che tu non possa estendere l’output della coda più di una volta !? Qualcuno sa quale sia l’accordo e c’è una soluzione?

EDIT: per rispondere alle domande finora, il file ha sicuramente contenuti che dovrebbero essere visualizzati dal grep. Come prova se il grep è fatto in questo modo:

 tail --follow=name file.txt | grep something 

L’output si presenta correttamente, ma se viene usato invece:

     tail --follow=name file.txt | grep something | grep something 

    Non viene mostrato alcun output.

    Se del tutto utile sto usando Ubuntu 10.04

    Si potrebbe anche incontrare un problema con il buff di grep quando si è all’interno di una pipe. cioè, non si vede l’output da

      tail --follow=name file.txt | grep something > output.txt 

    dato che grep buffererà la propria uscita.

    Usa l’opzione –line-buffered per grep per ovviare a questo problema:

     tail --follow=name file.txt | grep --line-buffered something > output.txt 

    Questo è utile se vuoi ottenere i risultati del follow nel file output.txt il più rapidamente ansible.

    Capito cosa stava succedendo qui. Si scopre che il comando sta funzionando è solo che l’uscita impiega molto tempo per raggiungere la console (circa 120 secondi nel mio caso). Questo perché il buffer sullo standard out non è scritto su ciascuna riga, ma su ogni blocco. Quindi, invece di ottenere ogni riga dal file mentre veniva scritta, otterrei un blocco gigante ogni 2 minuti circa.

    Va notato che questo funziona correttamente:

     tail file.txt | grep something | grep something 

    È il seguente del file con --follow=name che è problematico.

    Per i miei scopi ho trovato un modo per aggirarlo, quello che intendevo fare era catturare l’output del primo grep in un file, quindi il comando sarebbe:

     tail --follow=name file.txt | grep something > output.txt 

    Un modo per aggirare questo è usare il comando di script modo:

     script -c 'tail --follow=name file.txt | grep something' output.txt 

    Lo script acquisisce l’output del comando e lo scrive in un file, evitando così la seconda pipe.

    Ciò mi ha efficacemente aggirato, e ho spiegato perché il comando non funzionava come mi aspettavo, problema risolto.

    Cordiali saluti, Queste altre domande StackOverflow sono correlate:
    Trucca un’applicazione per pensare che il suo stdin sia interattivo, non una pipa
    Forza l’output standard di un altro programma per essere unbuffered usando Python

    Sai che la tail inizia di default con le ultime dieci righe del file? La mia ipotesi è che tutto ciò che la versione cat è stata trovata nel passato. Prova tail -n+1 --follow=name file.txt per iniziare dall’inizio del file.

    funziona per me su Mac senza --follow=name

     bash-3.2$ tail delme.txt | grep po position.bin position.lrn bash-3.2$ tail delme.txt | grep po | grep lr position.lrn 

    nome file grep | modello di grep | modello di grep | modello di grep ……