Je souhaite obtenir uniquement des adresses e-mail se terminant par "@ xyz.nl" à partir de mon fichier journal de messagerie. Pour y parvenir, je fais:
# tail -f /var/log/mail.log | grep --i --line-buffered "@xyz.nl" | cut -d '@' -f 1 | cut -d '<' -f 2
Le --line-buffered avec grep est nécessaire car il tamponnera autrement sa sortie car le canal n'est pas considéré comme un terminal. Grep produira des lignes comme celles-ci:
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)
La première coupe fait alors:
Aug 29 11:56:01 localhost postfix/smtp[4124]: 05491500123: to=<someone
La deuxième coupe devrait générer:
someone
Cependant, il semble que la coupe soit également en mémoire tampon. Si je lance la commande avec cat au lieu de tail -f, j'obtiens tous les résultats pertinents (dans le format préféré) du fichier journal. Mais j'ai besoin des résultats du fichier journal en temps réel.
J'ai essayé d'utiliser unbuffer pour cela:
# tail -f /var/log/mail.log | grep --i --line-buffered "@xyz.nl" | unbuffer cut -d '@' -f 1 | cut -d '<' -f 2
A également essayé:
# unbuffer tail -f /var/log/mail.log | grep --i --line-buffered "@xyz.nl" | unbuffer cut -d '@' -f 1 | cut -d '<' -f 2
... ce qui devrait supprimer la mise en mémoire tampon 4K de la première coupe . Cependant, cela ne fonctionne pas. Je sais qu'il est en mémoire tampon parce que si je convoite pour notre domaine local, il obtient beaucoup plus de visites, le tampon est rempli plus tôt et la sortie est générée plus tôt (en lots 4K).
Ma question est donc: comment puis-je couper sans tampon ?
Connexes: je sais que sed et (g) awk peuvent me fournir les adresses e-mail. J'ai essayé mais pour l'instant sans résultat. Les réponses utilisant sed ou (g) awk sont les bienvenues et peuvent résoudre mon problème direct mais je reste intéressé par la réponse nominale de la question comment débuffer la commande cut. La commande cut ne parle pas de (dé) mise en mémoire tampon.
grep -oP '[^<]+(?=@xyz.nl)'
(avec vos autres options de grep si nécessaire)
awk -F'[><@]' '/@xyz.nl/ {print $2}'
...