web-dev-qa-db-fra.com

Quelle expression régulière puis-je utiliser pour faire correspondre une adresse IP?

Avec la syntaxe grep suivante, je souhaite faire correspondre toutes les adresses IP d'un fichier (à partir d'un script ksh)

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

Le problème: il correspond également aux mots (IP) de plus de 4 octets:

1.1.1.1.1 

ou

192.1.1.1.160

Comment faire correspondre une adresse IP valide et uniquement des adresses IP de 4 octets? Je peux aussi utiliser Perl - une solution de syntaxe sur une ligne si grep ne fonctionne pas.

35
jennifer

essaye ça:

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

qui correspond à toutes les expressions de 0.0.0.0 à 999.999.999.999

avec

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

vous obtiendrez des adresses IP seulement

note:
sur solaris probablement egrep fera l'affaire.

56
udo

Comment c'est:

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

Le

-w / --Word-regexp 

flag to grep fait en sorte qu'il ne corresponde qu'aux limites du mot, ce qui signifie que votre correspondance doit être entourée d'espaces ou bien commencer/terminer au début/à la fin de la ligne!

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.

Pour ne trouver que des correspondances de 4 octets exactement (à l'exception de choses comme 1.1.1.1.1), utilisez ceci:

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

Il ne devrait jamais détecter d’adresses non-IP. L'expression pourrait être plus complexe pour vérifier plus de choses, mais cela devrait fonctionner dans la plupart des cas. Il ne correspondra pas à un 0 précédent car 010.1.12.1 n'est pas un moyen courant d'écrire des adresses IP.

5
Stefan Seidel

Un peu délicat, mais ça devrait marcher:

( 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]) $ '

Version modifiée de la réponse d'Arnaud B.

Cette expression ne fera pas correspondre les adresses IP avec les 0 premiers. Par exemple, elle ne correspondra pas à 192.168.1.01 Cette expression ne correspondra pas aux adresses IP de plus de 4 octets. Par exemple, il ne correspondra pas à 192.168.1.2.3

0
Thomas

Expression régulière pour faire correspondre une adresse IP dans TCL

définir un "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

J'utilise egrep "^([0-9]{1,3}\.){3}[0-9]{1,3}" /etc/hosts pour faire correspondre les adresses IP au début d'une ligne. Il peut également être utilisé sans le ^ pour autoriser les espaces ou autres caractères avant l'adresse IP.

[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}'

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

0
user2357585

Une version plus courte de la longue expression régulière:

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

Veuillez utiliser grep -E ou egrep en fonction de la version de votre système d'exploitation.

0
Suhail