¿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.

jennifer
fuente
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.

Tú haces
fuente
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
Joe Casadonte
fuente
¡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.

Dominik George
fuente
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.

Stefan Seidel
fuente
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;
Arnaud B.
fuente
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 )
Ciro
fuente
¿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

Thomas
fuente
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.
Falk
fuente
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

Suhail
fuente
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

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

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

Niko
fuente