¿Cómo desabrochar el corte?


8

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=<someone@xyz.nl>, 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}'...
jasonwryan

1
intente grep -oP '[^<]+(?=@xyz.nl)'(junto con sus otras opciones grep según sea necesario)
Sundeep

¡Tanto las opciones awk como grep anteriores funcionan de maravilla!
Forkbeard

Respuestas:


16

Si está en un sistema que usa GNU Coreutils (casi cualquier Linux), puede intentar stdbuf:

… | stdbuf -oL cut -d '@' -f 1 | …

-oL hace que la línea esté protegida, lo que parece lo que quieres.


Esto es exactamente lo que estaba buscando, ¡gracias!
Forkbeard

No cambia nada para mí por alguna razón. :(
panzi

1
@panzi Siéntase libre de hacer su propia pregunta, vinculando a esta. Incluya detalles completos (comando exacto que está ejecutando si es posible, sistema operativo, distribución y versión, etc.) Esperemos que alguien pueda descubrir por qué no funciona para usted.
derobert
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.