La redirección de salida de Linux no funciona con awk

La redirección de salida de Linux no funciona con awk

Estoy intentando escribir un buen archivo csv basado en algún resultado de la parte superior. Vuelvo a formatear la salida con awk así:

top -b | nawk '/Cpu/ || /Tasks/ { if($1 ~ /Cpu/) { printf "%s,",$3 } else { printf "\n" } }'

Eso funciona perfectamente. Ahora quiero guardar el resultado en un archivo. Creo que el uso > output.logdebería funcionar:

top -b | nawk '/Cpu/ || /Tasks/ { if($1 ~ /Cpu/) { printf "%s,",$3 } else { printf "\n" } }' > output.log

Sin embargo, esto simplemente da como resultado un archivo vacío cuando presiono Ctrl-C fuera del proceso superior. ¿Qué estoy haciendo mal?

Respuesta1

La biblioteca de E/S estándar de Unix (“stdio”) detecta en qué tipo de cosa (receptor de datos) está escribiendo. Si detecta una terminal (es decir, una ventana), escribe datos inmediatamente cuando el programa los solicita. Sin embargo, al escribir en un archivo, la biblioteca de E/S almacena los datos en un buffer y los escribe en bloques de 512 (o más) bytes a la vez. Por supuesto, vacía el búfer (escribiendo un bloque parcial) cuando el programa que llama sale, si sale limpiamente. Una terminación anormal (como la causada por Ctrl+ C) puede dejar un archivo de salida incompleto.

Para solucionarlo, intente:

top -b | ( trap "" 2; nawk '(tu nawkorden)' > output.log)`

El trapcomando lo hará nawkinmune al Ctrl+ C. (Por supuesto, el Ctrl+ Cseguirá interrumpiendo el topproceso y nawkfinalizará (¡limpiamente!) cuando llegue a un final de archivo (EOF) en la tubería.

PD: Esto supone (requiere) que esté ejecutando bashun bashshell compatible.

Respuesta2

Top sigue corriendo. Quieres ejecutarlo una cantidad limitada de veces. Utilice la opción -n. al igual que:

top -b -n 1 | awk '{ ... }'

Alternativamente, puede salir de top cuando lo desee con C-\. Usar Cc lo abortará y romperá la tubería prematuramente (antes de que awk obtenga algo).

$ top -b | cat -n > moo ; wc -l moo
^\Quit
352 moo

información relacionada