Ich möchte die IP ganz nebenher extrahieren (axyz-pc)
. Ich habe diese Aufgabe über grep
einen Befehl mit regulären Ausdrücken erledigt. Aber ich muss über awk und sed extrahieren.
grep -Po '(?<='axyz-pc')[^:]+' logs | grep -oE '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}'| sort -nr| uniq -c |sort -nr
Protokolle:
2017-04-11 15:15:00 SMTP connection from (axyz-pc) [36.32.138.106]:1236 I=[10.10.19.36]:25 closed by DROP in ACL
2017-04-11 15:15:01 H=(axyz-pc) [114.225.87.41]:3823 I=[10.10.19.36]:25 rejected EHLO or HELO axyz-pc: HELO/EHLO - HELO on heloblocks Blocklist
2017-04-11 15:15:01 SMTP connection from (axyz-pc) [114.225.87.41]:3823 I=[10.10.19.36]:25 closed by DROP in ACL
2017-04-11 15:15:02 H=(axyz-pc) [36.32.138.216]:1984 I=[10.10.19.36]:25 rejected EHLO or HELO axyz-pc: HELO/EHLO - HELO on heloblocks Blocklist
2017-04-11 15:15:02 SMTP connection from (axyz-pc) [36.32.138.216]:1984 I=[10.10.19.36]:25 closed by DROP in ACL
2017-04-11 15:15:02 H=(axyz-pc) [37.49.224.14]:51593 I=[10.10.19.36]:25 rejected EHLO or HELO axyz-pc: HELO/EHLO - HELO on heloblocks Blocklist
2017-04-11 15:15:02 SMTP connection from (axyz-pc) [37.49.224.14]:51593 I=[10.10.19.36]:25 closed by DROP in ACL
2017-04-11 15:15:02 H=(axyz-pc) [36.32.138.106]:4619 I=[10.10.19.36]:25 rejected EHLO or HELO axyz-pc: HELO/EHLO - HELO on heloblocks Blocklist
Die Ausgabe sollte lauten (doppelte IP, nicht wiederholt):
36.32.138.106
114.225.87.41
36.32.138.216
37.49.224.14
Antwort1
Ich bin mir nicht sicher, warum grep
es hängen bleibt, das müssen Sie weiter untersuchen. Allerdings ist hier kein Perlre erforderlich, so etwas würde genügen (zumindest für das von Ihnen angegebene Beispiel):
grep -o 'axyz-pc) \[[^]]*' | grep -o '[^[]*$'
Ausgabe:
36.32.138.106
114.225.87.41
114.225.87.41
36.32.138.216
36.32.138.216
37.49.224.14
37.49.224.14
36.32.138.106
Jetzt numerisch sortieren und anwenden uniq
:
sort -t. -k1,1n -k2,2n -k3,3n -k4,4n | uniq
Ausgabe:
36.32.138.106
36.32.138.216
37.49.224.14
114.225.87.41
Antwort2
Wenn Sie verwenden müssen sed
, vorausgesetzt, dass die IP in den ersten Klammern steht:
sed -n '/axyz-pc/s/[^[]*\[\([0-9.]*\).*/\1/p' x|sort -nr| uniq
Antwort3
Verwenden Sie awk und teilen Sie ihm mit, dass die Felder mit ]
„oder“ getrennt sind [
und dass wir nur das zweite Feld benötigen:
awk -F'[][]' '
{uniqoccurences[$2]++;}
END { for (i in uniqoccurences) {
print i ":" uniqoccurences[i]
}
} '
Im obigen Beispiel drucke ich auch ":n", also die Anzahl der Vorkommen von "$2", aber das ist nicht nötig (in diesem Fall führen Sie es einfach print i
in der Schleife innerhalb des END
Abschnitts aus).
Der reguläre Ausdruck: [][]
verwendet die gleiche Art und Weise wie reguläre Ausdrücke ]
und [
innerhalb einer [...]
Zeichenklasse behandeln (ein ]
direkt nach einem [
wird dann als zu suchendes Zeichen behandelt, und ein [
nach dem ersten [
(und vor einem schließenden ]
) wird ebenfalls als zu suchendes Zeichen behandelt. Es wird also [][]
nach ]
oder gesucht [
) .
Ein anderer Weg:
awk -F'[][]' '{ print $2 }' | sort | uniq
Antwort4
cat in.txt | awk '/SMTP/{print $7}'
gibt mir das.
[36.32.138.106]:1236
[114.225.87.41]:3823
[36.32.138.216]:1984
[37.49.224.14]:51593
Für den letzten Schritt:
cat in.txt | awk '/SMTP/{print $7}' | sed -e 's/\[//; s/\]//; s/:...//'
Bearbeiten: Die obigen 7 $ funktionieren nicht, da die beiden Zeilenarten unterschiedliche Feldoffsets für die IP-Adresse haben. Ein besserer Weg könnte sein:
cat in.txt | awk -F "axyz-pc\) \[" '{print $2}' | awk -F"\]" '{print $1}'
Wir würden „axyz-pc“ als Feldtrennzeichen im ersten Awk verwenden und dann die Ausgabe an das zweite Awk weiterleiten.
Stattdessen sed zu verwenden, wäre nicht kompliziert.