grep y sed con pipe from tail -f parecen estar almacenando en caché

grep y sed con pipe from tail -f parecen estar almacenando en caché

Estoy intentando conseguir un sistema que funcione para monitorear registros especiales. Por lo general, solo quiero un patrón muy específico que extraigo usando grepy una tubería del archivo tail -f. He notado que grep no genera todo, sino que mantiene algunas líneas almacenadas en el búfer. Supongo que eso tiene sentido si tienes una tubería que generará todo y luego terminará y cerrará la transmisión.
Pero con tail -feso no me funciona.

El mismo problema aparece con sed.

Aquí hay un comando de ejemplo que quiero usar:

clear && tail -F -n1000 /var/log/fail2ban.log | grep 'WARNING.*Ban' | sed s/'fail2ban.actions: WARNING '//g | grep -E --color 'ssh-iptables-perma|$'

Para dar un ejemplo:

La última línea del comando anterior es esta:

2015-05-04 11:17:24,551 [ssh-iptables] Ban x.x.x.x

Y usando este comando:

clear && tail -F -n1000 /var/log/fail2ban.log | grep 'WARNING.*Ban' | sed s/'fail2ban.actions: WARNING '//g

La última línea es esta:

2015-05-04 19:45:17,615 [ssh-iptables] Ban y.y.y.y

Eliminar más tuberías me lleva a las entradas más recientes.

¿Cómo puedo evitar este almacenamiento en caché en las tuberías?

Respuesta1

Agregue grepla opción --line-bufferedy sedla opción --unbuffered.

Respuesta2

Utilice la opción grepde --line-buffered.

De forma predeterminada, las utilidades usan búfer de línea si su salida estándar es una terminal, pero usan búferes más grandes (probablemente 4 u 8 kB) cuando su salida está conectada a un descriptor de archivo o una tubería.

Tienes suerte de que tail -Futiliza el almacenamiento en búfer de línea de forma predeterminada y greptiene una opción de línea de comando para habilitarlo. No conozco un método genérico para habilitar el almacenamiento en búfer de línea para un comando arbitrario.

información relacionada