30 votos

¿Cómo se puede extraer direcciones de IP de los archivos usando una expresión regular en un shell de linux?

Cómo extraer una parte de texto regexp en shell de linux? Digamos, tengo los archivos, donde en cada línea es una dirección IP, pero en diferente posición. ¿Cuál es la forma más simple para extraer las direcciones IP utilizando común de unix herramientas de línea de comandos?

50voto

brien Puntos 1799

Usted podría usar grep para tirar de ellos hacia fuera.

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

26voto

Sarel Botha Puntos 5911

La mayoría de los ejemplos que aquí se emparejan en 999.999.999.999 que no es técnicamente una dirección IP válida.

El siguiente partido en sólo direcciones IP válidas (incluyendo la red y las direcciones de difusión).

grep -E -o '(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)' file.txt

Omitir el-o si desea ver toda la línea que coincide.

9voto

JB. Puntos 12482

Por lo general comienzan con grep, para obtener la regexp derecho.

# [multiple failed attempts here]
grep    '[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*'                 file  # good?
grep -E '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' file  # good enough

A continuación, me gustaría probar, y convertirlo sed a filtrar el resto de la línea. (Después de leer este hilo, tú y yo no vamos a hacer eso: vamos a usar grep -o )

sed -ne 's/.*\([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\).*/\1/p  # FAIL

Eso es cuando me suele enfadarse con sed para la no utilización de la misma, expresiones regulares como cualquier otra persona. Así que me mudo a perl.

$ perl -nle '/[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}/ and print $&'

Perl bueno saber que, en cualquier caso. Si tienes un poquitín de CPAN instalado, usted puede incluso hacer que sea más confiable a bajo costo:

$ perl -MRegexp::Common=net -nE '/$RE{net}{IPV4}/ and say $&' file(s)

2voto

Avi Puntos 14468

Usted puede utilizar sed. Pero si usted sabe de perl, que podría ser más fácil, y más útiles en el largo plazo:

perl -n '/(\d+\.\d+\.\d+\.\d+)/ && print "$1\n"' < file

2voto

James Puntos 11

Yo escribí un pequeño script para ver mis archivos de registro mejor, no es nada especial, pero podría ayudar a un montón de personas que están aprendiendo perl. Hace búsquedas de DNS en direcciones IP después de que se extrae de ellos.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X