Quiero obtener solo las direcciones de correo electrónico que terminan en "@ xyz.nl" de mi archivo de registro de correo. Para lograr esto hago:
# tail -f /var/log/mail.log | grep --i --line-buffered "@xyz.nl" | cut -d '@' -f 1 | cut -d '<' -f 2
El --line-buffer con grep es necesario porque de lo contrario amortiguará su salida porque la tubería no se considera un terminal. Grep generará líneas como estas:
Aug 29 11:56:01 localhost postfix/smtp[4124]: 05491500123: to=<[email protected]>, relay=123.456.123.456[123.456.123.456]:25, delay=2, delays=0.4/0/0.4/1.2, dsn=2.0.0, status=sent (250 2.0.0 u7T9twxN074009 Message accepted for delivery)
El primer corte luego hace:
Aug 29 11:56:01 localhost postfix/smtp[4124]: 05491500123: to=<someone
El segundo corte debería generar:
someone
Sin embargo, parece que el corte también está amortiguando. Si inicio el comando con cat en lugar de tail -f obtengo todos los resultados relevantes (en el formato preferido) del archivo de registro. Pero necesito los resultados del archivo de registro en tiempo real.
Intenté usar unbuffer para esto:
# tail -f /var/log/mail.log | grep --i --line-buffered "@xyz.nl" | unbuffer cut -d '@' -f 1 | cut -d '<' -f 2
También probé:
# unbuffer tail -f /var/log/mail.log | grep --i --line-buffered "@xyz.nl" | unbuffer cut -d '@' -f 1 | cut -d '<' -f 2
... que debería eliminar el almacenamiento en búfer 4K del primer corte . Sin embargo, esto no funciona. Sé que está almacenando en búfer porque si busco nuestro dominio local, obtiene muchos más éxitos, el búfer se llena antes y la salida se genera antes (en lotes de 4K).
Entonces mi pregunta es: ¿cómo desabrocho el corte ?
Relacionado: Sé que sed y (g) awk pueden entregarme las direcciones de correo electrónico. Lo he estado intentando pero hasta ahora sin ningún resultado. Las respuestas que usan sed o (g) awk son bienvenidas y pueden resolver mi problema directo, pero sigo interesado en la respuesta nominal de la pregunta de cómo liberar el comando de corte. El comando de corte no habla de (des) almacenamiento en búfer.
awk -F'[><@]' '/@xyz.nl/ {print $2}'
...grep -oP '[^<]+([email protected])'
(junto con sus otras opciones grep según sea necesario)Respuestas:
Si está en un sistema que usa GNU Coreutils (casi cualquier Linux), puede intentar
stdbuf
:-oL
hace que la línea esté protegida, lo que parece lo que quieres.fuente