Foros del Web » Administración de Sistemas » Unix / Linux »

grep y busqueda en cadena

Estas en el tema de grep y busqueda en cadena en el foro de Unix / Linux en Foros del Web. hola, necesito hacer una busqueda de un "palabro" dentro de un fichero y que me muestre las lineas superiores , máximo una, y por otra ...
  #1 (permalink)  
Antiguo 05/05/2015, 06:55
 
Fecha de Ingreso: junio-2003
Mensajes: 122
Antigüedad: 21 años, 5 meses
Puntos: 0
Pregunta grep y busqueda en cadena

hola,
necesito hacer una busqueda de un "palabro" dentro de un fichero y que me muestre las lineas superiores , máximo una, y por otra parte las 3 lineas siguietnes. EStoy usando el comando grep tal como muestra este comando:

grep -B 1 -A 3 -i "palabro" mi_fichero.txt

El caso es que con el resultado que me salga, me gustaría concatenar una busqueda sobre uno de los resultados que me muestre y haga a su vez una bisqueda de este. Esto es que si busco la palabra "casa" y me aparece este resultado:

mi casa es muy hermosa en madrid

Quisiera que después de esa linea q me muestra me haga una busqueda de la palabra "madrid", que normalmente cambiaria por otra ciudad pero siempre sería igual la cadena "mi casa es muy hermosa en"

¿alguien me puede echar un empijón y decirme como tendría que hacer..¿??

muchas gracias!!
__________________
startwav

http://e-hosting.startwave.com/img/banner.gif
Internet Nunca ha estado más cerca de Tí. e-Hosting Start Wave Media . Todo lo que necesitas para tener presencia en Internet.
Servicios de Registro Dominios / DNS / HOSTING / Y MUCHO MÁS...
  #2 (permalink)  
Antiguo 05/05/2015, 08:50
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: grep y busqueda en cadena

A ver si entendí:

Hacer una búsqueda con contexto de un "palabro", luego buscar en el resultado la última palabra de la línea coincidente (no del contexto), y hacer una nueva búsqueda en el mismo archivo, de esa última palabra.

awk hace muy sencillo encontrar la última palabra, simplemente tendrías que usar

awk '{ print $NF }'

tee bifurca su entrada, de tal manera que podés mostrar el texto en la pantalla al mismo tiempo que lo redirigís a un archivo o a otro proceso.

Podés usar variables para guardar el término a buscar, podés usar archivos temporales, o podés complicar el código haciendo algo como
Código BASH:
Ver original
  1. PALABRO=casa
  2. ARCHIVO=mi_fichero.txt
  3. grep -B 1 -A 2 "$PALABRO" "$ARCHIVO" | tee >( TERMINO=$(awk '/'$PALABRO'/ { print $NF }'); grep $TERMINO "$ARCHIVO" )
la salida de grep es redirigida por tee a la salida estándar (pantalla) y además a la subshell, donde se ejecuta awk para obtener la última palabra, se guarda ésta en una variable, y se ejecuta un nuevo grep.

Lo que te salga mejor :)
  #3 (permalink)  
Antiguo 05/05/2015, 09:22
 
Fecha de Ingreso: junio-2003
Mensajes: 122
Antigüedad: 21 años, 5 meses
Puntos: 0
Pregunta Respuesta: grep y busqueda en cadena

Cita:
Iniciado por AlvaroG Ver Mensaje
A ver si entendí:

Hacer una búsqueda con contexto de un "palabro", luego buscar en el resultado la última palabra de la línea coincidente (no del contexto), y hacer una nueva búsqueda en el mismo archivo, de esa última palabra.

awk hace muy sencillo encontrar la última palabra, simplemente tendrías que usar

awk '{ print $NF }'

tee bifurca su entrada, de tal manera que podés mostrar el texto en la pantalla al mismo tiempo que lo redirigís a un archivo o a otro proceso.

Podés usar variables para guardar el término a buscar, podés usar archivos temporales, o podés complicar el código haciendo algo como
Código BASH:
Ver original
  1. PALABRO=casa
  2. ARCHIVO=mi_fichero.txt
  3. grep -B 1 -A 2 "$PALABRO" "$ARCHIVO" | tee >( TERMINO=$(awk '/'$PALABRO'/ { print $NF }'); grep $TERMINO "$ARCHIVO" )
la salida de grep es redirigida por tee a la salida estándar (pantalla) y además a la subshell, donde se ejecuta awk para obtener la última palabra, se guarda ésta en una variable, y se ejecuta un nuevo grep.

Lo que te salga mejor :)

@AlcaroG muchas gracias!!!
la verdad es que has pillado perfectamente toda la idea, pero seguramente no me he explciado bien en la busqueda que quiero hacer dentro de la busqueda ya lanzada.
LA primera busqueda con grep me busca la palabra "palabro"
La seguda busqueda se debe de realizar sobre las lineas que se devuelvan de la primera busqueda pero no quiero que me tome la útima palabra de cada linea, quiero que me tome únicamente la última palabra de una linea concreta que me va a mostrar y que tiene , siempre, esta estructura:

mi casa tiene una palabro y está en madrid.

La parte fija de esta linea es: "mi casa tiene una palabro y está en"
y la parte que varia y quiero usar para que me busque de nuevo es " madrid"

¿me he explciado bien?

con lo que me has pasado me busca de todas las salidas de lineas la última palabra y en mi ejemplo , quiero la busqueda sobre una linea especifica para su última palabra.

MUCHAS GRACIAS!!!!!!!
__________________
startwav

http://e-hosting.startwave.com/img/banner.gif
Internet Nunca ha estado más cerca de Tí. e-Hosting Start Wave Media . Todo lo que necesitas para tener presencia en Internet.
Servicios de Registro Dominios / DNS / HOSTING / Y MUCHO MÁS...
  #4 (permalink)  
Antiguo 05/05/2015, 10:51
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: grep y busqueda en cadena

O sea, lo que tienes es un archivo con bloques como

una linea
mi casa tiene una palabro y está en madrid
otra línea
una línea más que menciona madrid
una línea extra

Y querés tener bloques de esta forma

mi casa tiene una palabro y está en madrid.
una línea más que menciona madrid

Me parece que lo mejor es usar awk un poco más. Asumiendo que la línea que menciona a madrid viene siempre después de la línea que contiene a palabro:

Código BASH:
Ver original
  1. awk '/'$PALABRO'/ { buscar=$NF; print } !/'$PALABRO'/ { if (buscar != "" && $0 ~ buscar) { print } }' "$ARCHIVO"

Con esto, al encontrar $PALABRO, definimos el término a buscar ($NF, el último campo de la línea).
De allí en más, cada vez que una línea contenga el valor de buscar, la imprimimos.
La prueba de que buscar no sea vacía es necesaria para evitar que se impriman todas las líneas hasta la primer ocurrencia de $PALABRO. La prueba de que la línea no contenga $PALABRO es necesaria para evitar que "mi casa tiene una palabro y está en madrid" se imprima dos veces.
  #5 (permalink)  
Antiguo 05/05/2015, 13:43
 
Fecha de Ingreso: junio-2003
Mensajes: 122
Antigüedad: 21 años, 5 meses
Puntos: 0
Pregunta Respuesta: grep y busqueda en cadena

Cita:
Iniciado por AlvaroG Ver Mensaje
O sea, lo que tienes es un archivo con bloques como

una linea
mi casa tiene una palabro y está en madrid
otra línea
una línea más que menciona madrid
una línea extra

Y querés tener bloques de esta forma

mi casa tiene una palabro y está en madrid.
una línea más que menciona madrid

Me parece que lo mejor es usar awk un poco más. Asumiendo que la línea que menciona a madrid viene siempre después de la línea que contiene a palabro:

Código BASH:
Ver original
  1. awk '/'$PALABRO'/ { buscar=$NF; print } !/'$PALABRO'/ { if (buscar != "" && $0 ~ buscar) { print } }' "$ARCHIVO"

Con esto, al encontrar $PALABRO, definimos el término a buscar ($NF, el último campo de la línea).
De allí en más, cada vez que una línea contenga el valor de buscar, la imprimimos.
La prueba de que buscar no sea vacía es necesaria para evitar que se impriman todas las líneas hasta la primer ocurrencia de $PALABRO. La prueba de que la línea no contenga $PALABRO es necesaria para evitar que "mi casa tiene una palabro y está en madrid" se imprima dos veces.
@AlvaroG
todo es correcto tal y como indicas salvo que la otra palabra a buscar no estará inmeditamente después de la primera de las lineas q se muestra, podrá estar cuatro lineas mas abajo o tres.. :-/

de nuevo gracias Maestro!!
__________________
startwav

http://e-hosting.startwave.com/img/banner.gif
Internet Nunca ha estado más cerca de Tí. e-Hosting Start Wave Media . Todo lo que necesitas para tener presencia en Internet.
Servicios de Registro Dominios / DNS / HOSTING / Y MUCHO MÁS...
  #6 (permalink)  
Antiguo 06/05/2015, 08:37
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: grep y busqueda en cadena

Eso no es problema, siempre que la línea "mi casa tiene un palabro y está en madrid" esté antes de las que contienen "madrid".
  #7 (permalink)  
Antiguo 06/05/2015, 09:00
 
Fecha de Ingreso: junio-2003
Mensajes: 122
Antigüedad: 21 años, 5 meses
Puntos: 0
Información Respuesta: grep y busqueda en cadena

Cita:
Iniciado por AlvaroG Ver Mensaje
Eso no es problema, siempre que la línea "mi casa tiene un palabro y está en madrid" esté antes de las que contienen "madrid".
@AlvaroG

Perdona pero me he perdido...

el problema que veo es que tu das por hecho que "madrid" será el termini fijo que debe buscar en esta frase que siempre existirá "mi casa tiene una palabro y está en"
el problema es que la frase puede terminar en "madrid" o "barcelona" o "sevilla"

mi casa tiene una palabro y está en madrid
mi casa tiene una palabro y está en barcelona
mi casa tiene una palabro y está en sevilla

El casoes que una vez que enceuntre donde se encuentra la casa, "madrid" sevilla..etc.. lo suyo seria que pudiera usarse la ciudad para hacer otra busqueda de forma automática con esa palabra y muestre las lineas q encuentre al igual que la primera de las busquedas.
__________________
startwav

http://e-hosting.startwave.com/img/banner.gif
Internet Nunca ha estado más cerca de Tí. e-Hosting Start Wave Media . Todo lo que necesitas para tener presencia en Internet.
Servicios de Registro Dominios / DNS / HOSTING / Y MUCHO MÁS...
  #8 (permalink)  
Antiguo 06/05/2015, 11:15
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: grep y busqueda en cadena

no doy por hecho que el término sea fijo, lo que asumí considerando la poca información que diste sobre tu archivo real, es que tendrías bloques definidos, algo como

CADENA FIJA [VARIABLE1]
LINEAS
...
LINEA CON [VARIABLE1]
...
CADENA FIJA [VARIABLE2]
LINEAS
...
LINEA CON [VARIABLE2]
....

Es decir, que solamente te interesaban las ocurrencias de VARIABLE1 que estuviesen antes de la próxima CADENA FIJA.

La verdad en este punto si queremos avanzar tendría que saber el formato correcto de tu archivo

Etiquetas: busqueda, cadena
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 08:01.