Optimización de grep

Temas sobre programación ( php, c, sql, html, perl, python, ruby, java, bash, etc ) y recursos ( herramientas, frameworks, hosting, cms, etc )

Moderadores: maiku, akodo

Responder
Avatar de Usuario
akodo
Moderador
Moderador
Mensajes: 1457
Registrado: Mié Nov 28, 2007 8:00 am
Ubicación: En la X del explorer (pulse para llamar)

Optimización de grep

Mensaje por akodo »

Tengo una lista de cadenas que tengo que comprobar si existen dentro de un determinado directorio (o lista de directorios). Lo que necesito saber es cuales de esas cadenas NO existen dentro de los ficheros de los directorios.

Tan sólo me interesa saber que existe la cadena o no, no en que ficheros existe. Si se puede mostrar el la cadena en caso de que no exista mejor.

Por el momento tengo el siguiente comando (lo estoy ejecutando por cada cadena y directorio a buscar), y estoy comprobando el "exit code" para saber si existe o no:

Código: Seleccionar todo

grep -rlq <cadena> <directorio>
¿Qué opciones puedo añadir para mejorar el tiemppo de búsqueda y bajo qué condiciones puedo añadirlas?

Inicialmente tenía la opción "-i" pero quitándola he bajado el tiempo de unos 235 segundos a unos 25, pero hay que seguir bajando.
Descargue el gestor de mp3 "Music Manager" -> ([url=http://ctrlalt.iespana.es]mmlf[/url])
Última versión del gestor "Music Manager" -> ([url=http://sourceforge.net/projects/jmusicmanager/]jmmm[/url])

Avatar de Usuario
niky45
Forista Ancestral
Forista Ancestral
Mensajes: 9186
Registrado: Jue Abr 12, 2007 7:00 am
Ubicación: tras la pantalla (...)
Contactar:

Re: Optimización de grep

Mensaje por niky45 »

si son varias cadenas, puedes hacer uso del -e....

Código: Seleccionar todo

grep -rlq -e{cadena1,cadena2,...} directorio
lo unico, que si encuentra una, se pararia, no se si diciendo cual o no. :?

por otra parte, si lo que buscas es saber si estan o no, a mi me parece mas logico esto....

Código: Seleccionar todo

[ $(grep -q cadena directorio/*) ] && echo yes || echo no 
la idea seria ejecutarlo en cada subdirectorio, y te diria si en este sale o no la(s) cadena(s). *

el recursive... tenia yo por ahi un script muy majo para ello. :wink:
programacion/bash-dircleaner-limpieza-d ... 50047.html

*nota: bueno, a menos que busques saber si esta o no, en cualquier lugar del arbol... entonces puedes meterle el -r a grep. (aka, puedes detallar un poco mas el problema?? la idea es, cada una de las cadenas, ver si esta por algun lugar del arbol, o cualquier cadena en cualquier lugar, o una cadena en una rama, .... ?!?)

ni idea de que tal sera el rendimiento de cualquiera de las opciones, es cosa tuya probarlo y comparar. yo solo doy ideas. :wink:

por cierto, inevitable: sabes que grep -v, te saca lo que NO coincida, verdad?? y que la salida (el codigo de error) es inversa... o era al reves?? nu se, pero miralo porque te puede ser util.... :? (hace poco estuve cacharreando con eso, pero ya no me acuerdo... :oops: )
#446716
>>"Linux: the operating system with a CLUE... Command Line User Environment".
(seen in a posting in comp.software.testing)

[ DNFD ] - [ F4A ] - [ dotfiles ]

Avatar de Usuario
akodo
Moderador
Moderador
Mensajes: 1457
Registrado: Mié Nov 28, 2007 8:00 am
Ubicación: En la X del explorer (pulse para llamar)

Re: Optimización de grep

Mensaje por akodo »

*nota: bueno, a menos que busques saber si esta o no, en cualquier lugar del arbol... entonces puedes meterle el -r a grep. (aka, puedes detallar un poco mas el problema?? la idea es, cada una de las cadenas, ver si esta por algun lugar del arbol, o cualquier cadena en cualquier lugar, o una cadena en una rama, .... ?!?)
Por cada cadena necesito saber si NO existe en cualquier fichero del árbol. Para dejarlo claro, si existe esa cadena, la destruyo|borro|ignoro. Sólo me interesa si NO existe.

Código: Seleccionar todo

[ $(grep -q cadena directorio/*) ] && echo yes || echo no 
El único problemilla que le veo es que el comando lo estoy lanzando desde un script en python, con lo que no sé si funcionaría bien. No obstante tiene pinta de mejorar lo que tengo hecho. Ahora mismo estoy creando un hilo en python para que me diga el "exit code" del comando para mostrar un mensaje, con lo que si el mensaje me lo muestra el comando directamente, mucho mejor. :)
Si alguien comenta como puedo lanzarlo desde python con subprocess.call o subprocess.Popen.... me refiero a la secuencia que tendría que poner:

Código: Seleccionar todo

['[', '$(grep -q cadena directorio)', ']', '&&', 'echo', 'yes', '||', 'echo', 'no']
¿Excluir o buscar en un tipo de fichero determinado (.txt, .html, etc) mejoraría el rendimiento? Imagino que dependerá del tamaño del fichero, pero para fichero "normales" de menos de 3000 líneas... a lo mejor el procesamiento de saber si tiene que leer el fichero o no consume más tiempo del que tardaría procesarlo.

En cuanto al uso de la opción -v.... no lo acabo de ver. Que yo sepa grep funciona línea por línea, con lo que si encuentra una línea que no coincida con la cadena (cosa extremadamente probable) no implica que la cadena no exista.
Descargue el gestor de mp3 "Music Manager" -> ([url=http://ctrlalt.iespana.es]mmlf[/url])
Última versión del gestor "Music Manager" -> ([url=http://sourceforge.net/projects/jmusicmanager/]jmmm[/url])

Avatar de Usuario
mcun
Administrador
Administrador
Mensajes: 3888
Registrado: Lun Abr 19, 2010 12:30 am
Ubicación: En una de las nalgas del culo del mundo (según la Bersuit Vergarabat)
Contactar:

Re: Optimización de grep

Mensaje por mcun »

Código: Seleccionar todo

#!/usr/bin/env python
import re
import  os
import sys

for f in filter(os.path.isfile, sys.argv[2:]):
    for line in open(f).readlines():
        if re.match(sys.argv[1], line):
            print line

esto creo que te sirve lo guardas como gr.py y se ejecuta

Código: Seleccionar todo

python gr.py grep -q python /home  && echo yes || echo no

fuente

http://stackoverflow.com/questions/1921 ... and-python
Los programadores de verdad no documentan. La documentación es para los idiotas que no pueden leer un volcado de memoria.

Trusted Network and Developer | Lee el Reglamento !! |WIKI-EL | Twitter @mr_mcun
Debian + TTY | ArchLinux + awesome | openSUSE + Gnome-Shell | Linux User #508809

Avatar de Usuario
akodo
Moderador
Moderador
Mensajes: 1457
Registrado: Mié Nov 28, 2007 8:00 am
Ubicación: En la X del explorer (pulse para llamar)

Re: Optimización de grep

Mensaje por akodo »

El código de mcum me parece elegante, pero creo que seguirá siendo más lento. Creo que un grep, a pesar de ser lanzado programáticamente y tener que monitorizar cuándo acaba el grep, sigue siendo más rápido que un código interpretado.

Además, teniendo varios procesadores disponibles sale más rentable lanzar varios greps.

Buen código, pero me parece lento.
Descargue el gestor de mp3 "Music Manager" -> ([url=http://ctrlalt.iespana.es]mmlf[/url])
Última versión del gestor "Music Manager" -> ([url=http://sourceforge.net/projects/jmusicmanager/]jmmm[/url])

Responder
  • Temas similares
    Respuestas
    Vistas
    Último mensaje