2017-11-16 1 views
2

ich den Tag/Monat und IP extrahiert haben, dass mein IMAP-Server werden kontinuierlich bruteforcing:Wie extrahiert man den Monat, den Tag des Monats und die IP-Adresse aus der Zeile mit sed oder awk?

Nov1 unknown[186.216.99.239]: 
Nov1 unknown[62.249.196.214]: 
Nov1 unknown[110.145.123.120]: 
Nov1 fixed-187-190-251-149.totalplay.net[187.190.251.149]: 
Nov1 pd9568164.dip0.t-ipconnect.de[217.86.129.100]: 
Nov1 unknown[103.227.88.130]: 

Ich möchte die Ausgabe wie unten sein:

Nov1 186.216.99.239 
Nov1 62.249.196.214 
Nov1 110.145.123.120 
Nov1 187.190.251.149 
Nov1 217.86.129.100 
Nov1 103.227.88.130 

ich dieses Ergebnis erreicht mit Kombination von sed , awk und cut mit unterem code, aber ich würde gerne lernen ob es bessere möglichkeiten gibt?

while read -r line 
    do 
     monthday=$(echo $line | awk '{ print $1 }') 
     # ip=$(echo $line | awk -F'[\\\[\\\]]' { print $2 }) 
     ip=$(echo $line| cut -d[ -f2| cut -d] -f1) 
     echo "${monthday} ${ip}" 
    done < badIpList.txt 
+0

Sie können die IP-Adresse mit einem der Befehle extrahieren, die in den Antworten hier aufgeführt sind: https://stackoverflow.com/questions/14928573/sed-how-to-extract-ip-address-using-sed –

Antwort

1

awk Lösung:

awk -F'[[:space:]\\[\\]]' '{print $1,$3}' file 
  • -F'[[:space:]\\[\\]]' - komplexe Feldseparator entweder Leerzeichen [:space:] oder [ oder ]. Dadurch wird die Linie, z. Nov1 unknown[186.216.99.239]: wird in Felder unterteilt werden: 1) Nov1, 2) unknown, 3) 186.216.99.239 und 4) :

Der Ausgang:

Nov1 186.216.99.239 
Nov1 62.249.196.214 
Nov1 110.145.123.120 
Nov1 187.190.251.149 
Nov1 217.86.129.100 
Nov1 103.227.88.130 
+0

Ich finde es einfach und leicht auf die Augen :) Würde es Ihnen etwas ausmachen, es ein wenig zu beschreiben? –

+1

@satch_boogie, ja, siehe meine Erklärung – RomanPerekhrest

1

versuchen, diese

sed -E 's/\s.*\[(.*)\]:/ \1/' file 

keine benötigten Schleifen.

4

Mit awk: Setzt den Feldseparator zum einem Raum, [ oder ], dann das erste und das dritte Feld drucken:

$ awk -F "[][ ]" '{ print $1, $3 }' infile 
Nov1 186.216.99.239 
Nov1 62.249.196.214 
Nov1 110.145.123.120 
Nov1 187.190.251.149 
Nov1 217.86.129.100 
Nov1 103.227.88.130 

bemerken, dass die Feldtrennzeichen ein regulärer Ausdruck ist, nämlich der Klammerausdruck [][ ]. Vom gawk manual:

Um eines der Zeichen umfassen \, ], - oder ^ in einem Ausdruck in eckigen Klammern, eine \ vor sich ausdrückte.

So würde der Ausdruck sein müssen

[\[\] ] 

aber, weil regelmäßig in Strings gespeichert Ausdrücke ("dynamic/computed regexps") zweimal gescannt werden, müssen wir den Backslash:

-F '[\\[\\] ]' 

oder um doppelte Anführungszeichen zu verwenden, wie ich tat, würde ich sowohl den umgekehrten Schrägstrich als auch den umgekehrten Schrägstrich entkommen müssen:

-F "[\\\[\\\] ]" 

was eindeutig nicht allzu lesbar ist. Zum Glück gibt es ein Schlupfloch:

Außerdem, wenn Sie ] direkt nach der [ Öffnung platzieren, die Schließbügel als einer der Charaktere behandelt wird abgestimmt werden.

so erhalten wir weg mit

-F "[][ ]" 

sogar in doppelten Anführungszeichen. Es gibt übrigens keinen wirklichen Grund, hier doppelte Anführungszeichen zu verwenden.

+0

w Thanks Ich hatte diese Frage in Gedanken über "[] []" seit Ewigkeiten und jetzt ist klar, cheers :) –

1

Einfache mit diesem Sed:

$ sed -r 's|^([^ ]*)[^[]*\[([^]]*)\].*|\1 \2|' badIpList.txt 
Nov1 186.216.99.239 
Nov1 62.249.196.214 
Nov1 110.145.123.120 
Nov1 187.190.251.149 
Nov1 217.86.129.100 
Nov1 103.227.88.130 

Logik: Drucken Sie das erste Wort und den Inhalt der eckigen Klammer.

Verwandte Themen