Mit welchem ​​regulären Ausdruck kann ich eine IP-Adresse abgleichen?

35

Mit der folgenden grepSyntax möchte ich alle IP-Adressen in einer Datei (aus einem kshSkript) abgleichen

  grep '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}' file

Das Problem: Es werden auch Wörter (IP) mit mehr als 4 Oktetten gefunden:

1.1.1.1.1 

oder

192.1.1.1.160

Wie kann ich eine gültige IP und nur IP-Adressen mit 4 Oktetten abgleichen? Ich kann auch Perl verwenden - eine einzeilige Syntaxlösung, falls grepdies nicht funktioniert.

jennifer
quelle
4
Es wird auch passen 999.999.999.999.
CYRUS
4
Sie möchten also nur IPv4-Adressen abrufen, oder ?
Arjan
5
Technisch gesehen sind IP-Adressen, wie 192.1.4097sie von Linux glibc und Windows akzeptiert werden, gültig.
Grawity
1
Ah, ich wusste es nie ! ping 2130706433, Auf OS X: PING 2130706433 (127.0.0.1): 56 data bytes.
Arjan
1
@Arjan: 0x7f.1und0177.1
Grawity

Antworten:

56

Versuche dies:

grep -E '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' /etc/hosts

das passt zu allen Ausdrücken von 0.0.0.0bis999.999.999.999

mit

grep -Eo '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' /etc/hosts

Sie erhalten nur IP-Adressen

hinweis:
auf solaris erledigt egrep wahrscheinlich die arbeit .

Du tust
quelle
Ich versuche das grep '\ b \ d {1,3} \. \ D {1,3} \. \ D {1,3} \. \ D {1,3} \ b' / etc / hosts, aber ich nichts bekommen - :(
Jennifer
1
@jennifer, Sie müssen erweiterte reguläre Ausdrücke aktivieren: grep -E <pattern> <file>(oder, um nur die Übereinstimmungen auszudrucken:grep -Eo <pattern> <file>
Arjan
so was ? grep -E '\ b \ d {1,3} \. \ d {1,3} \. \ d {1,3} \. \ d {1,3} \ b' / etc / hosts
Jennifer
3
@udo: Nun, das passt, 1.1.1.1.1aber es verbirgt das Letzte .1von der Ausgabe. Ich kann nicht sehen, wie es helfen kann.
CYRUS
1
Ihr regulärer Ausdruck stimmt nicht mit 10.0.0.1 überein
Stefan Seidel
10

Wie ist das:

perl -MRegexp::Common=net -ne '/($RE{net}{IPv4})/ and print "$1\n"' /etc/hosts
Joe Casadonte
quelle
Nett! (Dies kommt auch 192.1.1.1.160als zurück 192.1.1.1, was meiner Meinung nach für den Fragesteller in Ordnung ist.)
Arjan
2
Wenn konforme IP-Adressen wirklich gewünscht werden, ist dies die einzige Art von Lösung, bei der die Wahrscheinlichkeit besteht, dass sie fast vollständig ist. Als ich die Frage sah, dachte ich nur "Ich werde das nicht mit einer zehn Fuß langen Standard-Regexp-Stange anfassen". Vorbehalte, Vorbehalte überall :-).
Daniel Andersson
5

Das

-w / --word-regexp 

Wenn grepSie diese Option aktivieren, wird die Übereinstimmung nur an Wortgrenzen hergestellt. Dies bedeutet, dass Ihre Übereinstimmung entweder von Leerzeichen umgeben sein muss oder am Anfang / Ende der Zeile beginnen / enden muss.

Dominik George
quelle
5

Um nur Übereinstimmungen mit genau 4 Oktetten zu finden (ausgenommen 1.1.1.1.1), verwenden Sie Folgendes:

grep -P '(?<=[^0-9.]|^)[1-9][0-9]{0,2}(\.([0-9]{0,3})){3}(?=[^0-9.]|$)'

Es sollte niemals Nicht-IP-Adressen erkennen. Der Ausdruck könnte komplexer sein, um mehr Dinge zu überprüfen, aber dies sollte in den meisten Fällen funktionieren. Es stimmt nicht mit einer vorhergehenden 0 überein, da 010.1.12.1 keine übliche Methode zum Schreiben von IP-Adressen ist.

Stefan Seidel
quelle
5
if [ ` echo $ip | '^((25[0-5]|2[0-4][0-9]|[01]?[1-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[1-9][0-9]?)$'  | grep -o "\." | wc -l` -eq 1 ];
then ipv4=true;
else 
ipv4=false;
Arnaud B.
quelle
3

Ein bisschen knifflig, aber es sollte funktionieren:

( X='\([0-9]\{1,2\}\|1[0-9]\{2\}\|2[0-4][0-9]\|25[0-5]\)' ; grep "\([^\.]\|^\)$X\.$X\.$X\.$X\([^\.]\|$\)" file )
cYrus
quelle
Was ist 127.000.000.001dann ;-)
Arjan
Soweit ich weiß, haben IPs keine Auffüllungsnullen.
CYRUS
1
Hmmm, ping 127.000.000.001funktioniert sicher auf meinem Mac. Aber dann: Ich habe gerade erfahren, dass sogar ping 2130706433das gleiche Ergebnis erzielt wird. :-) Ups, ping 00127.00000.00000.00001übersetzt nach 87.0.0.1. Seltsam ... oder oktal vielleicht? Ja, oktal, also haben Sie Recht, wenn es um führende Nullen geht.
Arjan
Ja, 00127 (oktal) = 87 (dezimal). Sicher sind sie alle gültige IPs, aber ich denke, das ist nicht die Standardmethode, um sie darzustellen. Sowieso wird das vom Fragesteller nicht verlangt.
CYRUS
0

grep -E '^ ((25 [0-5] | 2 [0-4] [0-9] | [1]? [1-9] [0-9]?).) {3} (25 [ 0-5] | 2 [0-4] [0-9] | [1]? [1-9]? [0-9]) $ '

Geänderte Fassung der Antwort von Arnaud B..

Dieser Ausdruck stimmt nicht mit IP-Adressen mit führenden Nullen überein. Beispiel: Es stimmt nicht mit 192.168.1.01 überein. Dieser Ausdruck stimmt nicht mit IP-Adressen mit mehr als 4 Oktetten überein. Beispiel: Es stimmt nicht mit 192.168.1.2.3 überein

Thomas
quelle
Dies stimmt auch nicht mit 127.0.0.1 überein.
Chris Charabaruk
0

Ich verwende egrep "^([0-9]{1,3}\.){3}[0-9]{1,3}" /etc/hosts , um IP-Adressen am Anfang einer Zeile abzugleichen. Es kann auch verwendet werden, ohne ^Leerzeichen oder andere Zeichen vor der IP-Adresse zuzulassen.

[0-9]{1,3} --> this matches a number between 1 and 999.
\. --> this is to add the dot.
([0-9]{1,3}\.){3} --> get a number with a dot 3 times.
[0-9]{1,3} --> finally add the fourth number.
Falk
quelle
0

Eine kürzere Version des langen Regex:

egrep '([1-2]?[0-9]{0,2}\.){3,3}[1-2]?[0-9]{0,2}' 

Bitte verwenden Sie grep -E oder egrep entsprechend Ihrer Betriebssystemversion

Suhail
quelle
2
Willkommen bei Superuser. Diese Frage hat bereits mehrere gute Antworten. Bearbeiten Sie Ihre Antwort und erklären Sie, was sie besser / anders macht, damit die Menschen die Unterschiede zwischen ihnen besser verstehen.
Máté Juhász
Dieser Ausdruck berücksichtigt keine rechtlichen Hinweise wie 8.8.8.8 echo "8.8.8.8" | grep -Eo '([1-2][0-9]{0,2}\.){3,3}[1-2][0-9]{0,2}'=> no result
anneb
0

grep -Eo '([0-9] {1,3}.?) {4}'

Beispiel: locken http://korben.info/ip | grep "IP visible depuis mon serveur" | grep -Eo '([0-9] {1,3}.?) {4}'

user2357585
quelle
0

Regulärer Ausdruck zum Abgleichen einer IP-Adresse in TCL

setze ein "192.168.10.25"

if {[regexp
{^(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])$} $a]} 
{
    puts "yes"
}
abhilash.malla
quelle
-1

Folgendes hat für mich bei ksh und ksh93 unter AIX funktioniert:

ip =

[[$ ip == [0-9] @ ("" | [0-9]) @ ("" | [0-9]). [0-9] @ ("" | [0-9]) @ ("" | [0-9]). [0-9] @ ("" | [0-9]) @ ("" | [0-9]). [0-9] @ ("" | [0-9]) @ ("" | [0-9])] && echo OK || echo NOK Das obige kann modifiziert werden, um die bereitgestellte IP nach dem gewünschten Muster zu "filtern".

Niko
quelle