Los comandos combinados de Linux no escriben outfile.txt

Los comandos combinados de Linux no escriben outfile.txt

Quiero buscar en un archivo de registro (en tiempo real) el contenido de msg="yxyxyx" y luego escribir los valores únicos en outfile.txt.

Yo escribí esto:

tail -f /var/log/firewall.log | sed -n '/msg=/{s/.*msg=//;s/\S*=.*//;p}' | awk '!seen[$0]++' >> outfile.txt

El archivo exterior se crea pero está vacío. Está escribiendo perfectamente en la consola sin la parte >> outfile.txt.

¡Gracias!

Respuesta1

¿Podrías usar stdbuf -oL o stdbuf -o0 antes del comando awk como se muestra a continuación?

tail -f firewall.log | sed -nu '/msg=/{s/.*msg=//;s/\S*=.*//;p}' | stdbuf -oL awk '!seen[$0]++' >> outfile.txt

cola -f firewall.log | sed -nu '/msg=/{s/.mensaje=//;s/\S=.*//;p}' | stdbuf -o0 awk '!visto[$0]++' >> archivoout.txt

hombre sentado;

-u, --sin búfer

Cargue cantidades mínimas de datos de los archivos de entrada y vacíe los buffers de salida con más frecuencia.

hombre stdbuf;

stdbuf: ejecuta COMMAND, con operaciones de almacenamiento en búfer modificadas para sus transmisiones estándar.

-o, --output=MODO ajusta el almacenamiento en búfer del flujo de salida estándar

Si MODE es 'L', la secuencia correspondiente se almacenará en el búfer de línea. Esta opción no es válida con entrada estándar.

Si MODE es '0', la transmisión correspondiente no estará almacenada en el búfer.

P.ej;

primero ejecute esto;

user@h$ tail -f firewall.log | sed -nu '/msg=/{s/.*msg=//;s/\S*=.*//;p}' | stdbuf -oL awk '!seen[$0]++' >> outfile.txt

ejecuta esta otra terminal; echo msg="1" >> firewall.log, salida como se muestra a continuación;

user@h$ tail -f firewall.log | sed -nu '/msg=/{s/.*msg=//;s/\S*=.*//;p}' | stdbuf -oL awk '!seen[$0]++' >> outfile.txt

user@host$ cat outfile.txt
1

ejecutar de nuevo lo mismo echo msg="1" >> firewall.log, la salida no cambia;

Después de ejecutar esto; echo msg="2" >> firewall.log, salida como se muestra a continuación;

user@host$ tail -f firewall.log | sed -nu '/msg=/{s/.*msg=//;s/\S*=.*//;p}' | stdbuf -oL awk '!seen[$0]++' >> outfile.txt

user@host$ cat outfile.txt

1
2

información relacionada