Frage

Ich schreibe derzeit einen einfachen .sh-Skript eine Exim Protokolldatei für Strings passenden „‚o“zu analysieren. Derzeit wenn output.txt sehen, das alles gibt es eine 0 in jeder Zeile (606 Zeilen) gedruckt ist. Ich vermute, meine Logik falsch ist, wie awk keine Fehler werfen.

Hier ist mein Code (aktualisiert für Verkettung und Gegenfragen). Edit:. Ich habe einigen neuen Code aus Dmckee Antwort angenommen, dass ich jetzt mit über den alten Code zu Gunsten der Einfachheit Arbeits

awk '/o'\''/ {
         line = "> ";
         for(i = 20; i <= 33; i++) {
           line = line " " $i;
         }
         print line;
    }' /var/log/exim/main.log > output.txt

Irgendwelche Ideen?

EDIT: Aus Gründen der Klarheit willen, ich bin greppen für „o“ in E-Mail-Adressen, weil "ein unzulässiges Zeichen in E-Mail-Adressen (und in unseren Datenbanken, erscheinen nur bei o'-Präfix Namen)

EDIT 2: Wie pro Kommentar Anfrage, hier ist eine hygienisiert Probe von einem gewünschten Ausgang:

[xxx.xxx.xxx.xxx] kathleen.o'toole@domain.com <kathleen.o'toole@domain.com> routing defer (-51): retry time not reached

[xxx.xxx.xxx.xxx] julie.o'brien@domain.com <julie.o'brien@domain.com> routing defer (-51): retry time not reached

[xxx.xxx.xxx.xxx] james.o'dell@domain.com <james.o'dell@domain.com> routing defer (-51): retry time not reached

[xxx.xxx.xxx.xxx] daniel_o'leary@domain.com <aniel_o'leary@domain.com> routing defer (-51): retry time not reached

Der Grund, warum ich bei 20 in meiner Schleife beginnend bin ist, weil alles vor dem 20. Feld nur Standard-Log-Informationen, die nicht für meine Zwecke hier gebraucht wird. Ich brauche nur alles von der IP und darüber hinaus für diese Lösung (die Nachrichten für jede 550 Fehler sind für jeden Mail-Server im Einsatz da draußen. Ich bin eine Liste der allgemeinsten kompilieren)

War es hilfreich?

Lösung

Es gibt keine wirkliche Notwendigkeit für den grep hier. Lassen Sie awk wählen Sie die passenden Zeilen für Sie (und Fixierung Ihrer Verkettung Fehler per ΤΖΩΤΖΙΟΥ):

awk '/o'\''/ {
             line = "> ";
             for(i = 20; i <= 33; i++) {
               line = line " " $i;
             }
             print line;
        }' /var/log/exim/main.log > output.txt

Natürlich, erhalten Sie einige seltsame Flucht benötigen, wenn Sie es am promp tun wie oben. Es ist sauberer in einem Skript ...


Edit: Beim ersten Durchgang verpasste ich das + = Problem ...

Auch unter der Annahme, dass die Linie, die Sie oben gab teilweise ist, da es nur 13ish Felder hat (standardmäßig Felder weißen Raum begrenzt sind).

Andere Tipps

+ bedeutet numerischen Zusatz in awk. Wenn Sie verketten möchten, legen Sie einfach die Konstanten und / oder Ausdrücke mit Leerzeichen getrennt.

Also, das

line += " " + $i

sollte sich

line = line " " $i

EDIT: Iff exim Log-Dateien (ich bin mehr in Postfix :) werden durch ein Leerzeichen getrennt, ist nicht die folgenden einfacher:

grep -F o\' /var/log/exim/main.log | cut -d\  -f20-33 >output.txt

"'" ist in Ortsteilen nicht illegal. Aus RFC2821 , Abschnitt 4.1.2:

Local-part = Dot-string / Quoted-string

Dot-string = Atom *("." Atom)

Atom = 1*atext

2821 Weitere Referenzen RFC2822 für nicht lokal definierten Elemente, so:

atext           =       ALPHA / DIGIT / ; Any character except controls,
                        "!" / "#" /     ;  SP, and specials.
                        "$" / "%" /     ;  Used for atoms
                        "&" / "'" /
                        "*" / "+" /
                        "-" / "/" /
                        "=" / "?" /
                        "^" / "_" /
                        "`" / "{" /
                        "|" / "}" /
                        "~"

Mit anderen Worten: „'“ ist ein vollkommen legal unquoted characted in einer E-Mail Lokalteil zu haben. Nun mag es nicht legal sein auf Ihrer Website , aber das ist nicht das, was Sie gesagt haben.

Es tut sie nicht direkt zum Thema zu bleiben, aber ich wollte Ihre Behauptung korrigieren.

Aus Aufgabe und einfacher noch:. Python

import fileinput
for line in fileinput.input():
    if "'" in line:
        fields = line.split(' ')
        print "> ", ' '.join( fields[20:34] )
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top