Ich möchte nur E-Mail-Adressen, die mit "@ xyz.nl" enden, aus meiner E-Mail-Protokolldatei abrufen. Um dies zu erreichen, mache ich:
# tail -f /var/log/mail.log | grep --i --line-buffered "@xyz.nl" | cut -d '@' -f 1 | cut -d '<' -f 2
Die mit grep gepufferte --line ist erforderlich, da sie sonst ihre Ausgabe puffert, da die Pipe nicht als Terminal betrachtet wird. Grep gibt folgende Zeilen aus:
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)
Der erste Schnitt macht dann:
Aug 29 11:56:01 localhost postfix/smtp[4124]: 05491500123: to=<someone
Der zweite Schnitt sollte erzeugen:
someone
Es scheint jedoch, dass der Schnitt auch puffert. Wenn ich den Befehl mit cat anstelle von tail -f starte, erhalte ich alle relevanten Ergebnisse (im bevorzugten Format) aus der Protokolldatei. Aber ich brauche die Ergebnisse aus der Protokolldatei in Echtzeit.
Ich habe versucht, dafür Unbuffer zu verwenden:
# tail -f /var/log/mail.log | grep --i --line-buffered "@xyz.nl" | unbuffer cut -d '@' -f 1 | cut -d '<' -f 2
Auch versucht:
# unbuffer tail -f /var/log/mail.log | grep --i --line-buffered "@xyz.nl" | unbuffer cut -d '@' -f 1 | cut -d '<' -f 2
... was die 4K-Pufferung vom ersten Schnitt entfernen sollte . Dies funktioniert jedoch nicht. Ich weiß, dass es gepuffert ist, denn wenn ich nach unserer lokalen Domain greife, werden viel mehr Treffer erzielt, der Puffer wird früher gefüllt und die Ausgabe wird früher generiert (in 4K-Stapeln).
Meine Frage ist also: Wie kann ich den Schnitt entpuffern ?
Verwandte: Ich weiß, sed und (g) awk kann mir die E-Mail-Adressen liefern. Ich habe es versucht, aber bisher ohne Ergebnis. Antworten mit sed oder (g) awk sind willkommen und können mein direktes Problem lösen, aber ich bin weiterhin an der nominalen Antwort auf die Frage interessiert, wie der Befehl cut entpuffert werden kann. Der Befehl cut spricht nicht von (Un-) Pufferung.
awk -F'[><@]' '/@xyz.nl/ {print $2}'
...grep -oP '[^<]+([email protected])'
(zusammen mit Ihren anderen grep-Optionen nach Bedarf)Antworten:
Wenn Sie auf einem System mit GNU Coreutils (fast jedem Linux) arbeiten, können Sie Folgendes versuchen
stdbuf
:-oL
macht es zeilengepuffert, was wie das scheint, was Sie wollen.quelle