PDA

Ver la versión completa : [Ayuda] Shellscripts: egrep y for all in egrep



pakoito
11/03/2009, 01:10
Bueno, estoy de profesor de shellscripts y tengo sólo dos dudas que no he conseguido resolver.

* ¿Cómo hago para que un egrep devuelva todas las líneas? había pensado en `egrep .* fichero` pero no va.

* La segunda duda es con el for:

Almaceno un `egrep :<variable>: fichero` en otra variable, lista. Luego uso esa variable en un for:


lista=`egrep :<variable>: fichero`
for var in $lista
do
echo $var
done

El problema está en que si el fichero tiene alguna línea con un espacio en blanco ' ' el in lo interpreta como línea nueva a meter en el conjunto y se jode el invento. Por ejemplo, si con egrep saco una línea que es 6001:casa:blanca:grande y nueva el for me escribirá por pantalla


6001:casa:blanca:grande
y
nueva



¿Soluciones plis?

hopez
11/03/2009, 02:33
No acabo de pillar el sentido a ese script...

Si quieres sacar todas las líneas de un archivo porqué no haces un cat?

Para el segundo ¿no te vale hacer simplemente un nuevo grep de lista? o un echo directo de lista

pakoito
11/03/2009, 02:45
Esos cachos de código van a en programas más tochos.

A/ Caso A: para recorrer posteriormente todas las líneas de un fichero pero metiendolas en un conjunto que usar luego en un for (como se ve en el caso B), cosa que haciendo un simple CAT no hace.

B/Caso B

lista=`egrep :<variable>: ficheroA`
for var in $lista
do
codigo=`echo $var | cut -d: -f2`
listados=`egrep :$codigo: ficheroB`
for linea in $listados
do
echo $linea pertenece a la clave $var
done
done

Teniendo ficheroA la forma de "clave:nombre:datos:codigo:mas" y ficheroB "codigo:descripcion". Como ejemplo de unas líneas de FicheroA

6700:caserío:rojo:2110:ruinoso
6500:mi casa:grande:2110:nada <- Daría el error que menciono por el espacio en el campo nombre. Una iteración del for recibirá sólo hasta el mi, y otra desde casa hasta el final.




¿Se entiende ahora mejor?

hopez
11/03/2009, 03:26
Mejor, por lo moenos la parte B...

lo que te pasa es que el for esta detectando el separador de campos como el caracter espacio, para cambiarlo puedes marcar el IFS como salto de línea:

lista=`egrep :<variable>: ficheroA`
IFS="
"
for var in $lista
do
codigo=`echo $var | cut -d: -f2`
listados=`egrep :$codigo: ficheroB`
for linea in $listados
do
echo $linea pertenece a la clave $var
done
done

Para la parte A a mi el cat me funciona correctamente, supongo que sigo sin entender como lo usas pero si se hace:

lista=`cat ficheroA`
IFS="
"
for var in $lista
do
codigo=`echo $var | cut -d: -f2`
listados=`egrep :$codigo: ficheroB`
for linea in $listados
do
echo $linea pertenece a la clave $var
done
done
tendría que funcionar

pakoito
11/03/2009, 03:28
Gracias por ambas soluciones, las probaré mañana.


tendría que funcionarEsperaré a ver, esperaré.