Wie schneide ich den Schnitt ab?


8

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

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}'...
Jasonwryan

1
versuchen Sie grep -oP '[^<]+(?=@xyz.nl)'(zusammen mit Ihren anderen grep-Optionen nach Bedarf)
Sundeep

Sowohl die oben genannten awk- als auch die grep-Optionen wirken wie ein Zauber!
Gabelbart

Antworten:


16

Wenn Sie auf einem System mit GNU Coreutils (fast jedem Linux) arbeiten, können Sie Folgendes versuchen stdbuf:

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

-oL macht es zeilengepuffert, was wie das scheint, was Sie wollen.


Genau das habe ich gesucht, danke!
Gabelbart

Ändert aus irgendeinem Grund nichts für mich. :(
Panzi

1
@panzi Fühlen Sie sich frei, Ihre eigene Frage zu stellen und auf diese zu verlinken. Bitte geben Sie alle Details an (genauer Befehl, den Sie ausführen, wenn möglich, Betriebssystem, Distribution und Version usw.). Hoffentlich kann jemand herausfinden, warum dies bei Ihnen nicht funktioniert.
Derobert
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.