Die tatsächlichen Protokolle sind:
2016-06-19 22:08:09 [213917] 1bEgCe-000tZR-E9 ** [email protected] ([email protected]) <[email protected]> F=<[email protected]> P=<[email protected]> R=lookuphost T=remote_smtp H=mailin-01.mx.aol.com [64.12.88.131]:25 I=[36.23.21.11]:60147: SMTP error from remote mail server after initial connection: 554- (RTR:BL) https://postmaster.aol.com/error-codes#554rtrbl\n554 Connecting IP: 36.23.21.11
2016-06-20 01:03:22 [516458] 1bEiwD-001zt7-IY ** [email protected] ([email protected]) <[email protected]> F=<[email protected]> P=<[email protected]> R=lookuphost T=remote_smtp H=mailin-02.mx.aol.com [64.12.88.163]:25 I=[36.23.21.14]:47630: SMTP error from remote mail server after initial connection: 554- (RTR:BL) https://postmaster.aol.com/error-codes#554rtrbl\n554 Connecting IP: 36.23.21.14
2016-06-20 09:29:46 [256975] 1bEqpT-0014jI-HV ** [email protected] F=<[email protected]> P=<[email protected]> R=dkim_lookuphost T=dkim_remote_smtp H=mailin-04.mx.aol.com [64.12.88.132]:25 I=[36.23.21.11]:43705: SMTP error from remote mail server after initial connection: 421 DYN:T2 https://postmaster.aol.com/error-codes#554rtrbl\n554 Connecting IP: 36.23.21.11
2016-06-20 11:41:34 [413114] 1bEstm-001jSC-Ic ** [email protected] F=<[email protected]> P=<[email protected]> R=dkim_lookuphost T=dkim_remote_smtp H=mailin-02.mx.aol.com [64.12.91.195]:25 I=[36.23.21.14]:48714: SMTP error from remote mail server after initial connection: 421 DYN:T1 https://postmaster.aol.com/error-codes#554rtrbl\n554 Connecting IP: 36.23.21.14
Was ich bekommen möchte:
Timestamp EmailTo: EmailFrom: IPAddress: ErrorCodes:
2016-06-19 [email protected] [email protected] 36.23.21.11 554- (RTR:BL)
2016-06-20 [email protected] [email protected] 36.23.21.14 554- (RTR:BL)
2016-06-20 [email protected] [email protected] 36.23.21.11 421 DYN:T2
2016-06-20 [email protected] [email protected] 36.23.21.14 421 DYN:T1
Ich habe die ersten drei Felder aus folgendem Befehl extrahiert:
echo -e "Timestamp\t\tEmailTo:\t\tEmailFrom:\t\t\t\t\t\t\t\tIPAddress:\tErrorCodes:" && awk 'NF>6 { d=6 ; while ( ! ($d ~ /^F=/ ) ) d++ ; printf "%s\t%s\t%s\n",$1,$6,substr($d,4,length($d)-4) ;} ' logs | column -t
Vielen Dank an alle, aber ich habe es durch Folgendes geschafft:
echo -e "Timestamp:\tEmailTo:\tEmailFrom:\t\tIPAddress:\tErrorCodes:" && awk 'NF>6 { d=6 ; while ( ! ($d ~ /^F=/ ) ) d++ ; print "%s\t%s\t%s\t%s\t%s\t%s\n",$1,$6,substr($d,4,length($d)-4),$NF,$(NF-5)$(NF-4) ; }' oops | column -t| grep -v "%s"
Antwort1
Mit der Verwendung von awk waren Sie auf dem richtigen Weg. Sie sollten ein Skript schreiben, das Ihre Protokolle liest und die Felder mit Tabulatoren¹ trennt. Verwenden Sie dann den Befehl „column“, um die Spalten neu auszurichten:
extrahieren.awk²:
BEGIN {OFS="\t"; print "Timestamp\tEmailTo:\tEmailFrom:\tIPAddress:\tErrorCodes:"}
{print $1, $6, $7, $NF, $(NF-5)}
Führen Sie es dann mit diesem Befehl aus:
awk -f extract.awk logs | column -t -s '^I'
Wobei dies '^I'
einen tatsächlichen Tabulator in Anführungszeichen darstellt.
Der einzige schwierige Teil war der Umgang mit den Fehlermeldungen in den Protokollen, die eine variable Anzahl von Wörtern umfassen konnten. Ich habe das gelöst, indem ich die Spalten für die IP- und Fehlercodefelder von rechts ausgezählt habe.
So sah die Ausgabe aus:
Timestamp EmailTo: EmailFrom: IPAddress: ErrorCodes:
2016-06-19 [email protected] ([email protected]) 36.23.21.11 554-
2016-06-20 [email protected] ([email protected]) 36.23.21.14 554-
2016-06-20 [email protected] F=<[email protected]> 36.23.21.11 421
2016-06-20 [email protected] F=<[email protected]> 36.23.21.14 421
Ich habe vielleicht falsch geraten, was die Eingabespalten betrifft, da Sie nicht angegeben haben, welche welche ist, und wenn Sie die E-Mail-Adressen in der dritten Spalte bereinigen möchten, sind Sie für awk vielleicht schon zu tief drin und es ist Zeit, über die Verwendung von Python oder Perl nachzudenken.
¹oder mit dem Ausgabetrennzeichen Ihrer Wahl, solange es nicht in den Daten vorkommt. Verwenden Sie es dann einfach als Argument -s
für column
.
²Wie @Kusalananda anmerkt, gibt es keinen Grund, ein awk-Skript als Einzeiler zu schreiben. Hier ist seine Version:
BEGIN {
OFS="\t";
print "Timestamp\tEmailTo:\tEmailFrom:\tIPAddress:\tErrorCodes:";
}
{
print $1, $6, $7, $NF, $(NF-5);
}
Ich persönlich mag Einzeiler.