Comment déboucher la coupe?

8

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=<[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)

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.

Forkbeard
la source
awk -F'[><@]' '/@xyz.nl/ {print $2}'...
jasonwryan
1
essayez grep -oP '[^<]+([email protected])'(avec vos autres options de grep si nécessaire)
Sundeep
Les options awk et grep ci-dessus fonctionnent comme un charme!
Forkbeard

Réponses:

16

Si vous utilisez un système utilisant GNU Coreutils (presque n'importe quel Linux), vous pouvez essayer stdbuf:

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

-oL rend la ligne mise en mémoire tampon, ce qui semble être ce que vous voulez.

derobert
la source
C'est exactement ce que je cherchais, merci!
Forkbeard
Cela ne change rien pour moi pour une raison quelconque. :(
panzi
1
@panzi N'hésitez pas à poser votre propre question, en vous connectant à celle-ci. Veuillez inclure tous les détails (commande exacte que vous exécutez si possible, système d'exploitation, distribution et version, etc.) J'espère que quelqu'un sera en mesure de comprendre pourquoi cela ne fonctionne pas pour vous.
derobert