buscar cadenas en un fichero de texto

Imagen de thenosic
0 puntos

Hola a todos

    Estoy haciendo un script en el cual, tengo que seleccionar de una linea de un fichero de texto una sub-cadena concreta

 

Pongamos mi ejemplo

<meta direction="original"><layer3 protonum="2" protoname="ipv4"><src>150.214.141.252</src><dst>150.214.186.69</dst></layer3><layer4 protonum="17" protoname="udp"><sport>43786</sport><dport>53</dport></layer4><counters><packets>1</packets><bytes>62</bytes></counters></meta><meta direction="reply"><layer3 protonum="2" protoname="ipv4"><src>150.214.186.69</src><dst>150.214.141.252</dst></layer3><layer4 protonum="17" protoname="udp"><sport>53</sport><dport>43786</dport></layer4><counters><packets>1</packets><bytes>109</bytes></counters></meta></flow>

todo este texto ocupa 1 sola linea (no hay saltos de linea), y de el, quiero extraer solo la direccion IP que aparece en src (en negrita):

<src>***.***.***.***</src>

el problema es que tanto el comando grep, como awk me devuelven la linea entera donde se encuentra el patron, y yo solo quiero que me devuelva el patron.

se seguro que no es algo dificil, pero estoy atascado

Gracias de antemano por vuestra ayuda

 

Saludos!! 

Imagen de slap
+1
0
-1

Con un vistazo a la página del manual de grep lo hubieras solucionado:

man grep
...
-o, --only-matching
    Show only the part of a matching line that matches PATTERN
...

Usando la opción -o, grep devuelve sólo la parte que encaja con el patrón.

Saludos.

+1
0
-1

Saludos.

0000 start out (+FD),A
           ld  BC, +7FFF
           jp 03CB, RAM-CHECK

http://www.injiniero.es

Imagen de sansatan
+1
0
-1

Me parecía un tema interesante y he hecho un par de pruebas. 

Slap, un par de cosas, algo que yo no resuelvo: ¿Por qué la segunda opción no devuelve la línea en cuestión?

$ cat borrame

<src>150.214.141.252</src><dst>150.214.186.69</dst></layer3><layer4 protonum="17" protoname="udp"><sport>43786</sport><dport>53</dport></layer4><counters><packets>1</packets><bytes>62</bytes></counters></meta><meta direction="reply"><layer3 protonum="2" protoname="ipv4"><src>150.214.186.69</src><dst>150.214.141.252</dst></layer3><layer4 protonum="17" protoname="udp"><sport>53</sport><dport>43786</dport></layer4><counters><packets>1</packets><bytes>109</bytes></counters></meta><
<src>***.***.***.***<
 

$ egrep -o \<src\>.+\<\/src\> borrame

<src>150.214.141.252</src><dst>150.214.186.69</dst></layer3><layer4 protonum="17" protoname="udp"><sport>43786</sport><dport>53</dport></layer4><counters><packets>1</packets><bytes>62</bytes></counters></meta><meta direction="reply"><layer3 protonum="2" protoname="ipv4"><src>150.214.186.69</src>

$ egrep -o \<src\>*\<\/src\> borrame

Por otro lado, ¿Cómo resolver el problema del anidamiento?

 

+1
0
-1

--------------------------------------

Un error muy frecuente: Confundir valor y precio.

Imagen de slap
+1
0
-1

Hola sansatan :)

En la segunda opción le estás pidiendo cadenas que sean de la forma:

<src</src>
<src></src>
<src>></src>
...
Es decir:
la cadena: <src

seguida de 0 o más >

y a continuación: </src>

En el caso del amigo thenosic, la expresión sería algo así:

<src>[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}<\/src>

Se podría refinar un poco más para que las ips fueran válidas: rango (0-255)

No entiendo lo que dices del anidamiento.

Edito: Ya sé lo que querías decir. El problema es que, normalmente, siempre se encaja el patrón más largo. En el primer caso le estás diciendo: <src> + cualquier caracter 1 o más veces + </src> con lo cual te encaja toda la línea con tu patrón.
Prueba la ER que he puesto y verás como sólo devuelve las ips con los tags SRC.

Edito 2: Para los frikis como yo que nos apasionan las expresiones regulares hay una web que contiene mucha información: http://www.regular-expressions.info/
es la mejor que he encontrado sobre el tema.
Además ofrecen un software: regexbuddy que, en su versión gratuita, funciona bien con wine y es muy bueno.

Saludos

+1
0
-1

Saludos.

0000 start out (+FD),A
           ld  BC, +7FFF
           jp 03CB, RAM-CHECK

http://www.injiniero.es

Imagen de sansatan
+1
0
-1

Entiendo porqué no funciona con el corchete.

Sobre el anidamiento tenía entendido que había una manera de que se quedase con la secuencia corta en lugar de con la larga, pero quizá me equivoque.

Ciertamente la expresión que tú has puesto funciona, pero ¿qué pasaría si no supieses ninguna propiedad a priori de lo que hay dentro de las etiquetas? Bueno ... pensánsolo bien, puedes especificar que dentro no haya una ocurrencia de </src>.

Muchas gracias por tu ayuda, está bien aprender.

--------------------------------------

Un error muy frecuente: Confundir valor y precio.

+1
0
-1

--------------------------------------

Un error muy frecuente: Confundir valor y precio.