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

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

Avec la syntaxe grep suivante, je veux 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 faut aussi faire correspondre les mots (IP) qui ont plus de 4 octets :

1.1.1.1.1

ou

192.1.1.1.160

Comment faire correspondre une IP valide et seulement les adresses IP de 4 octets ? Je peux aussi utiliser Perl - une solution syntaxique d'une ligne, si grep ne fonctionne pas.

Réponses (12)

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

Essayez ceci :

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 n'obtiendrez que les adresses IP

note: sur solaris probablement egrep fera le travail.

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

Comment ça se passe ?

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

Pour ne trouver que les correspondances de 4 octets exactement (à l'exclusion 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 doit jamais détecter les adresses non IP. L'expression pourrait être plus complexe pour vérifier plus de choses, mais cela devrait fonctionner dans la plupart des cas. Elle ne correspondra pas à un 0 précédent car 010.1.12.1 n'est pas une façon courante d'écrire les adresses IP.

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

Le drapeau

-w / --word-regexp

à grep fait qu'il ne correspond qu'aux limites des mots, ce qui signifie que votre correspondance doit soit être entourée d'espaces blancs, soit commencer / finir au début / à la fin de la ligne !

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

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

Une version plus courte de la longue regex :

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

Veuillez utiliser grep -E ou egrep selon la version de votre OS

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

Expression régulière pour la correspondance d'une adresse IP dans le 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
0
0
2016-09-01 09:46:09 +0000

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

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

Cette expression ne correspondra pas aux adresses IP avec des 0 de tête. 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, elle ne correspondra pas à 192.168.1.2.3

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

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 permettre les espaces blancs 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.
-1
-1
-1
2017-02-15 10:02:50 +0000

Voici ce qui a fonctionné pour moi pour ksh et ksh93 dans AIX :

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 Ce qui précède peut être modifié afin de “filtrer” l'IP fournie selon le modèle souhaité.