Perché grep non funziona con il reindirizzamento?


15

L'uso del topcomando con reindirizzamento funziona correttamente:

top > top.log

Ora voglio usare grep per filtrare una certa linea:

top | grep "my_program" > top.log

Ma il file di registro rimarrà vuoto. Ma grep fornisce un output durante l'utilizzo

top | grep "my_program"

Dove my_programdeve essere sostituito da un programma in esecuzione per vedere alcuni output.

Perché il mio approccio non funziona? E come posso ripararlo?

bash  grep 

2
L'ho appena provato e funziona per me. Tuttavia, dovresti probabilmente esaminare l' -bopzione topo utilizzare psinvece.
Lev Levitsky,

-bnon ha risolto il mio problema, ma risolto alcuni problemi di codifica. Grazie.

Risposte:


22

Ho lo stesso comportamento che descrivi. Su Ubuntu 11.10

top | grep "my_program" > top.log

non produce alcun output.

Credo che la ragione di ciò sia che grep sta bufferizzando il suo output. Per dire a GNU grep di sputare l'output riga per riga, usa l' --line-bufferedopzione:

top | grep --line-buffered "my_program" > top.log

Vedi anche questa domanda SO per altre potenziali soluzioni.


3
+1 --line-bufferedrisolve il problema.

Grazie, questo risolve il problema anche per me. L' -bopzione è ancora un buon consiglio anche da Lev Levitsky. Ciò ha risolto alcuni problemi di codifica con il file di registro.

2

dovresti usare:

top -n 1 | grep "blah" > top.log

"-n 1" esegue top per una iterazione e quindi si chiude invece di aggiornarsi continuamente ogni pochi secondi

dal momento che stai solo cercando una riga anche se ps sarebbe uno strumento migliore da usare.


1

La mia soluzione alternativa per questo problema era:

while :;do top -b -n 1 | grep "my_program" >> top.log;done &

In questo modo potrei avere un monitor in esecuzione in background per my_program e mantenere tutti i risultati nel file top.log.



0

Sebbene entrambi funzionino per me, penso che il consiglio di Lev Levitsky sia quello corretto. Usa l' -bargomento.

C'è una buona probabilità che il reindirizzamento dell'output sia il problema e che non stia ottenendo nulla tramite stdout, quindi prova questo:

top -b 2>&1 | grep "my_program" > top.log

Si noti che potrebbero verificarsi problemi anche con il buffering dell'output. La shell non scriverà costantemente nel file, quindi potrebbe richiedere del tempo prima top.logche si riempia.

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.