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

¿Qué expresión regular puedo utilizar para hacer coincidir una dirección IP?

Con la siguiente sintaxis grep quiero hacer coincidir todas las direcciones IP de un fichero (de un script ksh)

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

El problema: También coincide con palabras (IP) que tienen más de 4 octetos:

1.1.1.1.1

o

192.1.1.1.160

¿Cómo puedo hacer coincidir una IP válida y sólo direcciones IP con 4 octetos? También puedo usar Perl - una solución de sintaxis de una línea, si grep no funciona.

Respuestas (12)

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

pruebe esto:

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

que coincide con todas las expresiones desde 0.0.0.0 hasta 999.999.999.999

con

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

obtendrá direcciones IP sólo

nota: en solaris probablemente egrep hará el trabajo.

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

¿Qué tal esto?

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

Para encontrar sólo coincidencias con 4 octetos exactamente (excluyendo cosas como 1.1.1.1.1) use esto:

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

Nunca debería detectar direcciones no IP. La expresión podría ser más compleja para verificar más cosas, pero esto debería funcionar en la mayoría de los casos. No coincidirá con un 0 precedente ya que 010.1.12.1 no es una forma común de escribir direcciones IP.

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

La bandera

-w / --word-regexp

a grep hace que sólo coincida con los límites de las palabras, lo que significa que su coincidencia debe estar rodeada de espacios en blanco o comenzar/terminar al principio/fin de la línea.

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

Un poco complicado, pero debería funcionar:

( 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

Una versión más corta de la regex larga:

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

Por favor, utilice grep -E o egrep según la versión de su sistema operativo

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

Expresión regular para la coincidencia de una dirección ip en TCL

establecer 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}’

Ejemplo : 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]?[0-9])$’

Versión modificada de la respuesta de Arnaud B.

Esta expresión no coincidirá con direcciones IP con 0s a la izquierda. por ejemplo, no coincidirá con 192.168.1.01 Esta expresión no coincidirá con direcciones IP con más de 4 octetos. por ejemplo, no coincidirá con 192.168.1.2.3

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

Estoy usando egrep "^([0-9]{1,3}\.){3}[0-9]{1,3}" /etc/hosts para hacer coincidir las direcciones IP al principio de una línea. También se puede utilizar sin el ^ para permitir espacios en blanco u otros caracteres antes de la dirección 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

Esto es lo que me ha funcionado para ksh y ksh93 en 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 Lo anterior puede modificarse para “filtrar” la IP proporcionada con el patrón que se desee.