2010-10-24 12:00:49 +0000 2010-10-24 12:00:49 +0000
36
36

Welchen regulären Ausdruck kann ich verwenden, um eine IP-Adresse abzugleichen?

Mit der folgenden grep-Syntax möchte ich alle IP-Adressen in einer Datei abgleichen (aus einem ksh-Skript)

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

Das Problem: Es passt auch auf Wörter (IP), die mehr als 4 Oktette haben:

1.1.1.1.1

oder

192.1.1.1.160

Wie kann ich eine gültige IP abgleichen und nur IP-Adressen mit 4 Oktetten? Ich kann auch Perl verwenden - eine Ein-Zeilen-Syntax-Lösung, wenn grep nicht funktioniert.

Antworten (12)

57
57
57
2010-10-24 13:01:43 +0000

Versuchen Sie dies:

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

, was auf alle Ausdrücke von 0.0.0.0 bis 999.999.999.999

passt, mit

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

erhalten Sie nur IP-Adressen

Anmerkung: auf Solaris wird wahrscheinlich egrep den Job erledigen.

10
10
10
2010-10-24 13:50:10 +0000

Wie ist das?

perl -MRegexp::Common=net -ne '/($RE{net}{IPv4})/ and print "$1\n"' /etc/hosts
5
5
5
2012-09-13 08:12:16 +0000
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;
5
5
5
2012-09-13 08:35:57 +0000

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

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 verifizieren, aber dies sollte für die meisten Fälle funktionieren. Es wird nicht auf eine vorangestellte 0 passen, da 010.1.12.1 keine übliche Schreibweise für IP-Adressen ist.

5
5
5
2012-06-26 11:15:04 +0000

Das Flag

-w / --word-regexp

auf grep bewirkt, dass es nur auf Wortgrenzen passt, was bedeutet, dass Ihr Treffer entweder von Leerzeichen umgeben sein muss oder am Anfang/Ende der Zeile beginnen/enden muss!

3
3
3
2010-10-24 15:14:58 +0000

Ein wenig 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 )
1
1
1
2015-11-17 09:56:08 +0000

Eine kürzere Version der 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

0
0
0
2015-04-17 11:17:29 +0000

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

set a “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"
}
0
0
0
2016-09-01 09:46:09 +0000

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

Beispiel : curl http://korben.info/ip | grep “IP visible depuis mon serveur” | grep -Eo ‘([0-9]{1,3}.?){4}’

0
0
0
2013-09-02 05:56:39 +0000

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])$’

Modifizierte Version der Antwort von Arnaud B..

Dieser Ausdruck passt nicht zu IP-Adressen mit führenden 0s. z. B. passt er nicht zu 192.168.1.01 Dieser Ausdruck passt nicht zu IP-Adressen mit mehr als 4 Oktetten. z. B. passt er nicht zu 192.168.1.2.3

0
0
0
2015-10-29 18:58:11 +0000

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 ohne das ^ verwendet werden, um 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.
-1
-1
-1
2017-02-15 10:02:50 +0000

Hier ist, was bei mir für ksh und ksh93 in AIX funktioniert hat:

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 Die obigen Angaben können geändert werden, um die angegebene IP nach einem beliebigen Muster zu “filtern”.