it-swarm.com.de

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

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 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, wenn grep nicht funktioniert.

35
jennifer

versuche dies:

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

die mit allen Ausdrücken von 0.0.0.0 bis 999.999.999.999 übereinstimmt

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

Anmerkung:
auf Solaris erledigt wahrscheinlich egrep die Arbeit.

56
udo

Wie ist das:

Perl -MRegexp::Common=net -ne '/($RE{net}{IPv4})/ and print "$1\n"' /etc/hosts
10
Joe Casadonte

Das

-w / --Word-regexp 

flag to grep passt nur an Wortgrenzen an, dh Ihre Übereinstimmung muss entweder von Leerzeichen umgeben sein oder am Anfang/Ende der Zeile beginnen/enden!

5
Dominik George
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
Arnaud B.

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.

5
Stefan Seidel

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 )
3
cYrus

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. Es stimmt beispielsweise nicht mit 192.168.1.01 überein. Dieser Ausdruck stimmt nicht mit IP-Adressen mit mehr als 4 Oktetten überein. es stimmt beispielsweise nicht mit 192.168.1.2.3 überein

0
Thomas

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"
}
0
abhilash.malla

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 den ^ 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.
0
Falk

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
user2357585

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

0
Suhail