Usando um índice para tornar o grep mais rápido?

10

Eu me vejo segurando a mesma base de código repetidamente. Embora funcione bem, cada comando leva cerca de 10 segundos, por isso estou pensando em maneiras de torná-lo mais rápido.

Então, pode grepusar algum tipo de índice? Eu entendo que um índice provavelmente não ajudará em regexps complicados, mas eu uso principalmente padrões muito simples. Existe um indexador para este caso?

EDIT: Eu sei sobre ctags e coisas do gênero, mas gostaria de fazer uma pesquisa em texto completo.

Peltier
fonte
Você está usando opção recursiva para grep ou algum find / xargs como esse?
Michał Šrajer
@ Michał: sim, -R
Peltier

Respostas:

4

e quanto à cscope , isso combina com seus sapatos?

Permite pesquisar código para:

  • todas as referências a um símbolo
  • definições globais
  • funções chamadas por uma função
  • funções chamando uma função
  • sequência de texto
  • padrão de expressão regular
  • um arquivo
  • arquivos incluindo um arquivo
akira
fonte
Pode ser o que estou procurando, vou dar uma olhada. Obrigado!
Peltier
Parece que ele só funciona bem para C, talvez C ++ e Java
neves
4

Indexação de texto completo

Existem ferramentas como recoll , swish-e e sphinx, mas você teria que verificar se elas suportam o tipo de critério de pesquisa que você precisa.

Recoll

Recoll é uma ferramenta pessoal de pesquisa de texto completo para Unix / Linux.

Swish-e

O Swish-e é um sistema de código aberto rápido, flexível e gratuito para indexar coleções de páginas da Web ou outros arquivos.

Esfinge

O Sphinx permite indexar em lote e pesquisar dados armazenados em um banco de dados SQL, armazenamento NoSQL ou apenas arquivos de maneira rápida e fácil

grep

Estou surpreso que grep seja tão lento quanto você descreve, você pode reduzir o número de arquivos sendo pesquisados? Por exemplo, quando eu só preciso pesquisar nos arquivos de origem um executável (dentre muitos em um projeto), eu alimento o grep os nomes de um comando que lista os arquivos de origem para esse programa:

grep expression `sources myprogram`

sources é um programa específico para o meu ambiente de desenvolvimento, mas você pode ter (ou conseguir construir) algo equivalente.

Suponho que você tenha tentado técnicas óbvias, como

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

Eu li uma sugestão de que a -Popção atual greppode acelerar significativamente as pesquisas.

RedGrittyBrick
fonte
1
A localização do AFAIK é apenas para nomes de arquivos. Recoll funcionaria, mas eu preferiria uma ferramenta de linha de comando. A base de código é muito grande, e desde que eu estou procurando uma corda, eu não sei onde ele está, por isso é difícil para limitar o número de arquivos a serem pesquisados :)
Peltier
Eu acho que swish-e é linha de comando. Eu não tentei qualquer (grep é rápido o suficiente em meus projetos)
RedGrittyBrick
3

grep, não. Mas existem vários programas que usam índices e visam à base de código. ctags(existe uma versão fornecida com o vim), etags(destinada ao uso com o emacs), global(mais independente do editor) são as que estou pensando agora, mas provavelmente existem outras.

AProgrammer
fonte
Uso ctags, mas isso não se limita à pesquisa de nomes de funções? Eu quero fazer uma pesquisa de texto completo.
Peltier
Tenho certeza de que ctag também pode procurar por definição de classe e ISTR e também encontrar algum uso. Estou certo de que global faz as duas coisas. Mas é verdade que essas ferramentas não fazem uma pesquisa de texto completo e estão usando o conhecimento do idioma para limitar seu escopo.
AProgramador
3

Você pode copiar sua base de código em um disco RAM.

jfg956
fonte
2

se você quiser usar um mecanismo de pesquisa de texto completo. use um:

akira
fonte
Essa é sempre uma opção, mas eu queria saber se uma opção de aceleração grep mais leve, rápida e suja existiria.
Peltier
'mais leve', mas 'quer ter minhas coisas totalmente indexadas' são um pouco de 2 extremos :) ctags é a melhor correspondência para o que você deseja, se você quer apenas se livrar rapidamente. com tudo o mais, você acaba usando um mecanismo de busca de texto completo real. por exemplo, 'lembrar' mencionado na resposta @RedGrittyBrick está usando o xapian como back-end.
Akira
1
Eles não são necessariamente incompatíveis. Imagine se ctags tivesse uma opção --full-text, por exemplo, e grep uma opção --tag-file. É claro que o fato de que ele poderia existir não significa que ele faz :)
Peltier
-1

Não, eu não penso assim. Mas pode haver uma solução simples: tente aceitar. Eu acho que se você der uma chance, você o achará significativamente mais rápido que o grep, requer seqüências de caracteres mais curtas para obter melhores resultados de pesquisa e possui muitos recursos desejáveis, enquanto usa as mesmas opções de comando. Uma coisa que a torna mais rápida (embora não indexada) é que ela ignora muito mais coisas que você não deseja pesquisar. Está escrito em Perl e usa as expressões regulares do Perl (e, portanto, também possui portas Mac e Windows).

http://betterthangrep.com/

Mike de Shreveport
fonte
Ack é bem legal. Mas eu realmente duvido que seja mais rápido que o grep, pois é baseado nos mesmos mecanismos.
Peltier