[eside-ghost] Grepeando ERA: scripts...
txuruland en yahoo.es
txuruland en yahoo.es
Mar Feb 21 16:58:43 CET 2006
Siguiendo un poco con el tema, grep es el típico comando que en cuanto le
coges el truquillo, lo utilizas para todo. Una de las pegas que te encuentras
es que al ser un "filtrador" de caracteres, cuando además quieres buscar
rangos de números, se te queda un poco cojo.
Cuando tuve que enfrentarme al problema me rompí bastante la cabeza. Seguro
que existen otros comandos y combinaciones, pero yo llegue a este conjuro:
Ej: quiero buscar en muchos ficheros un rango de direcciones IPs (desde la
10.31.241.1 hasta la 10.31.241.10).
seq 1 10 | xargs -i grep -ir 10.31.241.{}[^0-9]* *
El comando seq es un comando que devuelve una lista de número entre los
extremos que le indiques. Ej seq 1 5 devolvería 1 2 3 4 5
El comando xargs es un comando que se utiliza para pasar parámetros bien a
comandos o a nuestros scripts (Muy util cuando estamos filtrando y no sabemos
exactamente cual sera el resultado de los parametros, o bien cuando un
comando no recibe desde un pipe ej ls ----> echo "/" | ls DIFERENTE A echo
"/" | xargs ls). La opción -i, indica que los parametros que le pasemos por
el pipe, los sustituirá por donde encuentre las llaves. Además una buena
práctica puede ser añadir la opción -t que además nos mostraría por pantalla
los comandos que va ejecutando.
Y por último el grep. -r = recursivo ; -i que no haga distinción entre
mayúsculas y minúsculas (ya se que aquí no tiene mucho sentido, pero lo pongo
porque es muy útil). Hay que tener en cuenta que si solo ponemos:
seq 1 10 | xargs -i grep -ir 10.31.241.{} * -> En los resultados nos
encontraríamos ips como la 10.31.241.100 por que es parte de la 1 y la 10,
así que podemos añadir diferentes coletillas para que solo nos filtre las que
queremos:
seq 129 142 | xargs -i grep -ir 10.31.241.{}" " * - Si sabemos que despues
siempre vendrá un espacio
seq 129 142 | xargs -i grep -ir 10.31.241.{}$ * - O si sabemos que está al
final de una línea.
Bueno espero que os sirva de ayuda, y si alguien sabe como hacerlo de otra
forma pues que lo comente.
On Tuesday 21 February 2006 16:14, Ender wrote:
> Aupa Halls!!
>
> un par de cosillas...
>
> > cat $F | grep patron
>
> Está bien, pero si sólo necesitas hacer un grep en un fichero deberías
> usar la sintaxis "grep patron fichero". Por dejarlo lo más simple
> posible, aunque lo que proponías está perfecto eh?
>
> > el * ese siempre hace referencia a una lista de parametros, separada
> > con espacio, por ejemplo
>
> El * en bash creo que se sustituye por el resultado de "ls".
> Para entender bien el funcionamiento del * en algunos comandos lo mejor
> es que nos imaginemos eso, sustituir directamente lo que nos daría un ls
> en el '*'... por ejemplo...
>
> cp * directorio/
>
> realmente es...
>
> cp `resultado del ls` directorio/
> (y NO copiaria ficheros ocultos por ejemplo)
> por lo que estamos utilizando en realidad la sintaxis "cp file1 file2
> file3 ... directorio/" que podéis encontrar en el man"
>
> Eso sí, puede ser que haya comandos que capturen el '*' y lo utilicen de
> otra forma...
>
> > PD: acabo de releer tu email... si lo k kieres es sacar el nombre de
> > solo akellos ficheros, puedes, dentro del bucle poner algo asi: if [ !
> > "$(cat $F|grep patron)" = "" ]; then do echo $F; fi
>
> ostia que grilladon, no?
>
> ¿No es mas cómodo utilizar la salida numérica de GREP? devuelve 0 en
> caso de encontrarlo y otro número si no, por lo que... el primer paso
> sería...
>
> cat $F | grep $patron && echo $F
>
> como queremos que grep funcione en silencio....
>
> cat $F | grep $patron >/dev/null 2>&1 && echo $F
>
> y como el CAT no hace falta...
>
> grep $patron $F >/dev/null 2>&1 && echo "encontrado en $F"
>
> Os aconsejo que tengáis en cuenta el código de error de los comandos, ya
> que es muy muy útil para hacer scripts...
>
> Saludetes!!
> Ender
>
> PD - grep -q opera en silencio y sería la mejor opción, ya que sale en
> cuanto encuentra la primera ocurrencia del patron, pero no se si es
> compatible con todas las versiones.
>
> _______________________________________________
> eside-ghost mailing list
> eside-ghost en deusto.es
> https://listas.deusto.es/mailman/listinfo/eside-ghost
Más información sobre la lista de distribución eside-ghost