¿Por qué grep no funciona con la redirección?

15

Usar el topcomando con redirección funciona bien:

top > top.log

Ahora quiero usar grep para filtrar una línea determinada:

top | grep "my_program" > top.log

Pero el archivo de registro permanecerá vacío. Pero grep ofrece una salida cuando se usa

top | grep "my_program"

Donde my_programtiene que ser reemplazado por un programa en ejecución para ver algunos resultados.

¿Por qué mi enfoque no funciona? ¿Y cómo puedo arreglarlo?


fuente
2
Lo probé y funciona para mí. Sin embargo, probablemente deberías mirar la -bopción topo usar en su pslugar.
Lev Levitsky
-bNo resolvió mi problema, pero resolvió algunos problemas de codificación. Gracias.

Respuestas:

22

Me sale el mismo comportamiento que usted describe. En Ubuntu 11.10

top | grep "my_program" > top.log

No produce ninguna salida.

Creo que la razón de esto es que grep está amortiguando su salida. Para decirle a GNU grep que escupe la salida línea por línea, use la --line-bufferedopción:

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

Vea también esta pregunta SO para otras posibles soluciones.

unutbu
fuente
3
+1 --line-bufferedresuelve el problema.
Gracias, esto también resuelve el problema para mí. La -bopción sigue siendo un buen consejo de Lev Levitsky también. Eso resolvió algunos problemas de codificación con el archivo de registro.
2

Deberías usar:

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

el "-n 1" se ejecuta en la parte superior durante una iteración y luego se cierra en lugar de actualizarse continuamente cada pocos segundos

ya que solo está buscando una línea, aunque ps sería una mejor herramienta para usar.

h3rrmiller
fuente
1

Mi solución para este problema fue:

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

De esta manera, podría tener un monitor en ejecución en segundo plano para my_program y mantener todos los resultados en el archivo top.log.

Alex Sed
fuente
0

Aunque ambos funcionan para mí, creo que el consejo de Lev Levitsky es el correcto. Usa el -bargumento.

Existe una buena posibilidad de que la redirección de salida sea el problema y que no esté obteniendo nada a través de stdout, así que intente esto en su lugar:

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

Tenga en cuenta que también podría tener problemas con el búfer de salida. Su shell no escribirá constantemente en el archivo, por lo que podría tardar un tiempo top.logen completarse.

Wolph
fuente