¿Usando un índice para hacer grep más rápido?

10

Me encuentro grepping la misma base de código una y otra vez. Si bien funciona muy bien, cada comando tarda unos 10 segundos, por lo que estoy pensando en formas de hacerlo más rápido.

Entonces, ¿puede grepusar algún tipo de índice? Entiendo que un índice probablemente no ayudará para expresiones regulares complicadas, pero uso principalmente patrones muy simples. ¿Existe un indexador para este caso?

EDITAR: Sé sobre ctags y similares, pero me gustaría hacer una búsqueda de texto completo.

Peltier
fuente
¿Está utilizando la opción recursiva para grep o alguna forma de encontrar / xargs?
Michał Šrajer
@ Michał: sí, -R
Peltier

Respuestas:

4

¿Qué pasa con cscope ?

Permite buscar código para:

  • todas las referencias a un símbolo
  • definiciones globales
  • funciones llamadas por una función
  • funciones que llaman a una función
  • cadena de texto
  • patrón de expresión regular
  • un archivo
  • archivos que incluyen un archivo
akira
fuente
Eso podría ser lo que estoy buscando, echaré un vistazo. ¡Gracias!
Peltier
Parece que solo funciona bien para C, tal vez C ++ y Java
neves
4

Indización de texto completo

Existen herramientas como recoll , swish-e y sphinx, pero tendría que verificar si pueden admitir el tipo de criterios de búsqueda que necesita.

Recoll

Recoll es una herramienta personal de búsqueda de texto completo para Unix / Linux.

Swish-e

Swish-e es un sistema de código abierto rápido, flexible y gratuito para indexar colecciones de páginas web u otros archivos.

Esfinge

Sphinx le permite indexar por lotes y buscar datos almacenados en una base de datos SQL, almacenamiento NoSQL o simplemente archivos de forma rápida y sencilla.

grep

Me sorprende que grep sea tan lento como lo describe, ¿puede reducir la cantidad de archivos que se buscan? Por ejemplo, cuando solo necesito buscar en los archivos de origen un ejecutable (de muchos en un proyecto), le doy a grep los nombres de un comando que enumera los archivos de origen para ese programa:

grep expression `sources myprogram`

sources es un programa específico para mi entorno de desarrollo, pero es posible que tenga (o pueda construir) algo equivalente.

Supongo que has probado técnicas obvias como

find /foo/myproject -name "*.c" -exec fgrep -l searchtext

He leído una sugerencia de que la -Popción actual greppuede acelerar significativamente las búsquedas.

RedGrittyBrick
fuente
1
AFAIK localizar es solo para nombres de archivo. recoll funcionaría, pero preferiría una herramienta de línea de comandos. La base del código es bastante grande, y como estoy buscando una cadena, no sé dónde está, así que es difícil limitar la cantidad de archivos que se buscarán :)
Peltier
Creo que swish-e es la línea de comandos. No he probado ninguna (grep es lo suficientemente rápido en mis proyectos)
RedGrittyBrick
3

grep, no. Pero hay varios programas que usan índices y están destinados a la base de código. ctags(hay una versión provista con vim), etags(pensada para usar con emacs), global(más independiente del editor) son las que estoy pensando ahora pero probablemente hay otras.

Un programador
fuente
Uso ctags, pero ¿eso no se limita a buscar nombres de funciones? Quiero hacer una búsqueda de texto completo.
Peltier
Estoy bastante seguro de que ctag también puede buscar definición de clase e ISTR que también le sirva de algo. Estoy seguro de que global hace ambas cosas. Pero es cierto que esas herramientas no realizan una búsqueda de texto completo y están utilizando el conocimiento del idioma para limitar su alcance.
Programador del
3

Puede copiar su base de código en un disco RAM.

jfg956
fuente
2

si quieres usar un motor de búsqueda de texto completo ... usa uno:

akira
fuente
Esa es siempre una opción, pero me preguntaba si existiría una opción de aceleración grep más ligera, rápida y sucia.
Peltier
'más liviano' pero 'quiero tener mis cosas completamente indexadas' son un poco de 2 extremos :) ctags es la mejor combinación para lo que quieres, si solo quieres ir rápido y sucio. con todo lo demás terminas usando un verdadero motor de búsqueda de texto completo. por ejemplo, 'recoll' mencionado en la respuesta @RedGrittyBrick está usando xapian como backend.
akira
1
No son necesariamente incompatibles. Imagine si ctags tuviera una opción --full-text, por ejemplo, y grep una opción --tag-file. Por supuesto, el hecho de que pueda existir no significa que sí :)
Peltier
-1

No, no lo creo. Pero puede haber una solución simple: intente ack. Creo que si le da una oportunidad, la encontrará significativamente más rápido que grep, requiere cadenas de búsqueda más cortas para obtener mejores resultados de búsqueda y tiene muchas características deseables, mientras usa los mismos interruptores de comando. Una cosa que lo hace más rápido (aunque no está indexado) es que ignora muchas más cosas que no desea buscar. Está escrito en Perl y usa las expresiones regulares de Perl (y, por lo tanto, también tiene puertos Mac y Windows).

http://betterthangrep.com/

Mike de Shreveport
fuente
Ack es genial. Pero realmente dudo que sea más rápido que grep, ya que se basa en los mismos mecanismos.
Peltier