¿Cómo canalizar la salida awk (con entrada periódica y continua) al archivo de salida?

10

Estoy tratando de escribir un comando que canalice la salida continua de un comando libre (se ejecuta cada segundo) a un comando awk que analiza un valor específico (memoria libre disponible) y lo envía a un archivo con una marca de tiempo. Aquí están mis intentos actuales en el comando:

free -mto -s 1 | awk '/Mem/ { print strftime("%r") "," $4 }' >>memOut

Y, alternativamente, después de un poco de Google

free -mto -s 1 | awk '/Mem/ { print strftime("%r") "," $4 >>"memOut"}'

Cada ejecución produce archivos vacíos. ¿Alguna sugerencia o posiblemente diferentes métodos?

marca
fuente

Respuestas:

13

Debe vaciar el búfer para ver algo memOutdurante la ejecución:

free -mto -s 1 | awk '/Mem/ { print strftime("%r") "," $4; fflush(stdout) }' >> memOut

Aquí hay una versión alternativa:

while sleep 1; do sed -n "s/MemFree: */`date`, /p" /proc/meminfo; done >> memOut
Ciro
fuente
Esto me dio el archivo de salida que quería. ¡Gracias!
Mark
3

Para versiones anteriores de awkusted puede que tenga que usar system("").

En realidad, fflush(stdout)es solo para versiones recientes de awky gawk, ya que solo está en el estándar POSIX desde diciembre de 2012.

free -mto -s 1 | awk '/Mem/ { 
    print strftime("%r") "," $4;
    system(""); # Flush output
}' >> memOut

Tenga en cuenta que con el uso de system("")cada descriptor de archivo, su descripción completa se encuentra en el gawkmanual, sección "9.1.4 Funciones de entrada / salida".

Steve Schnepp
fuente
3

En ciertas versiones de awk(por ejemplo, mawk 1.3.3) necesita agregar el -W interactiveindicador de línea de comando para habilitar la operación sin búfer con tuberías.

Pierz
fuente
2

Solo para asegurarse de que está obteniendo lo que realmente quiere y no lo que solicitó específicamente.

Si desea conocer la memoria disponible en el sistema para programas, entonces esto podría ser más adecuado:

free -m -s 1 | awk '/buffers\/cache/ { print strftime("%r") "," $4; fflush(stdout) }' >> memOut

La columna Usado de la línea Mem incluye cachés y memorias intermedias y, en la mayoría de los casos, cuando desee monitorear el uso de la memoria para una computadora / tarea determinada, al menos deben tenerse en cuenta.

Manwe
fuente