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


35

Con la siguiente grepsintaxis, quiero hacer coincidir todas las direcciones IP en un archivo (de un kshscript)

  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 solo direcciones IP con 4 octetos? También puedo usar Perl, una solución de sintaxis de una línea, si grepno funciona.


44
También coincidirá 999.999.999.999.
cYrus

44
Entonces, solo quieres grep direcciones IPv4, ¿ verdad ?
Arjan

55
Técnicamente, las direcciones IP como 192.1.4097válidas y aceptadas por Linux glibc y Windows.
Grawity

1
¡Ah, nunca lo supe ! ping 2130706433, En OS X: PING 2130706433 (127.0.0.1): 56 data bytes.
Arjan

1
@Arjan: 0x7f.1y0177.1
grawity

Respuestas:


56

prueba 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 de 0.0.0.0a999.999.999.999

con

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

solo obtendrá direcciones IP

nota:
en solaris probablemente egrep hará el trabajo.


Intento el grep '\ b \ d {1,3} \. \ D {1,3} \. \ D {1,3} \. \ D {1,3} \ b' / etc / hosts pero yo no recibas nada - :(
jennifer

1
@jennifer, necesitará habilitar expresiones regulares extendidas: grep -E <pattern> <file>(o, simplemente imprimir las coincidencias:grep -Eo <pattern> <file>
Arjan

Me gusta esto ? grep -E '\ b \ d {1,3} \. \ d {1,3} \. \ d {1,3} \. \ d {1,3} \ b' / etc / hosts
jennifer

3
@udo: Bueno, esto coincide 1.1.1.1.1pero oculta lo último .1de la salida, no puedo ver cómo puede ayudar.
cYrus

1
Tu expresión regular no coincide con 10.0.0.1
Stefan Seidel

10

Cómo es esto:

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

¡Agradable! (Esto también regresa 192.1.1.1.160como 192.1.1.1, lo que creo que está bien para el que hace la pregunta.)
Arjan

2
Si realmente se desean direcciones IP conformes, este es el único tipo de solución que tiene posibilidades de estar cerca de completarse. Cuando vi la pregunta, pensé: "No tocaré eso con un poste de expresiones regulares estándar de diez pies". Advertencias, advertencias en todas partes :-).
Daniel Andersson

5

los

-w / --word-regexp 

marcar para grepque solo coincida en los límites de palabras, lo que significa que su coincidencia debe estar rodeada por espacios en blanco o comenzar / finalizar al principio / final de la línea.


5

Para encontrar solo 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 debe detectar direcciones que no sean IP. La expresión podría ser más compleja para verificar más cosas, pero esto debería funcionar para la mayoría de los casos. No coincidirá con un 0 anterior ya que 010.1.12.1 no es una forma común de escribir direcciones IP.


5
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;

3

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 )

¿Qué hay de 127.000.000.001entonces? ;-)
Arjan

Hasta donde sé, las IP no tienen ceros de relleno.
cYrus

1
Hmmm, ping 127.000.000.001seguramente funciona en mi Mac. Pero entonces: acabo de enterarme de que incluso ping 2130706433produce el mismo resultado. :-) Vaya, se ping 00127.00000.00000.00001traduce en 87.0.0.1. Extraño ... O tal vez octal? Sí, octal seguro, así que tienes razón sobre los ceros iniciales, supongo.
Arjan

Sí, 00127 (octal) = 87 (decimal). Seguramente todas son IP válidas, pero supongo que esa no es la forma estándar de representarlas. De todos modos eso no lo solicita el autor de la pregunta.
cYrus

0

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

Versión modificada de la respuesta de Arnaud B.

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


Esto tampoco coincidirá con 127.0.0.1.
Chris Charabaruk

0

Estoy usando egrep "^([0-9]{1,3}\.){3}[0-9]{1,3}" /etc/hosts para hacer coincidir las direcciones IP al comienzo de una línea. También se puede usar sin ^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.

0

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

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

Utilice grep -E o egrep según sea adecuado para la versión de su sistema operativo


2
bienvenido a superusuario. Esta pregunta ya tiene varias buenas respuestas. Para ayudar a las personas a comprender las diferencias entre ellos, edite su respuesta y explique qué la hace mejor / diferente de las otras.
Máté Juhász

esta expresión no tiene en cuenta tales como IPS legales 8.8.8.8 echo "8.8.8.8" | grep -Eo '([1-2][0-9]{0,2}\.){3,3}[1-2][0-9]{0,2}'=> ningún resultado
anneb


0

Expresión regular para hacer coincidir 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"
}

-1

Esto es lo que funcionó para mí 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 se puede modificar para "filtrar" la IP proporcionada al patrón que se desee.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.