Extrahieren von Informationen über awk und sed

Extrahieren von Informationen über awk und sed

Ich möchte die IP ganz nebenher extrahieren (axyz-pc). Ich habe diese Aufgabe über grepeinen 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 grepes 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 iin der Schleife innerhalb des ENDAbschnitts 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.

verwandte Informationen