Utiliser un index pour accélérer la grep?


10

Je me surprends à répéter encore et encore la même base de code. Bien que cela fonctionne très bien, chaque commande prend environ 10 secondes, donc je réfléchis aux moyens de l'accélérer.

Alors, peut greputiliser une sorte d'index? Je comprends qu'un index ne sera probablement pas utile pour les expressions rationnelles complexes, mais j'utilise principalement des patters très simples. Existe-t-il un indexeur pour ce cas?

EDIT: Je connais les ctags et autres, mais je voudrais faire une recherche en texte intégral.


Utilisez-vous une option récursive pour grep ou des find / xargs comme way?
Michał Šrajer

@ Michał: oui, -R
Peltier

Réponses:


4

qu'en est-il de cscope , est-ce que cela correspond à vos chaussures?

Permet de rechercher du code pour:

  • toutes les références à un symbole
  • définitions globales
  • fonctions appelées par une fonction
  • fonctions appelant une fonction
  • chaîne de texte
  • modèle d'expression régulière
  • un fichier
  • fichiers dont un fichier

C'est peut-être ce que je recherche, je vais y jeter un œil. Merci!
Peltier

Il semble que cela fonctionne bien pour C, peut-être C ++ et Java
neves

4

Indexation de texte intégral

Il existe des outils tels que recoll , swish-e et sphinx, mais vous devez vérifier s'ils peuvent prendre en charge le type de critères de recherche dont vous avez besoin.

Rappel

Recoll est un outil de recherche de texte intégral personnel pour Unix / Linux.

Swish-e

Swish-e est un système open source rapide, flexible et gratuit pour l'indexation de collections de pages Web ou d'autres fichiers.

Sphinx

Sphinx vous permet d'indexer par lots et de rechercher des données stockées dans une base de données SQL, un stockage NoSQL ou simplement des fichiers rapidement et facilement

grep

Je suis surpris que grep soit aussi lent que vous le décrivez, pouvez-vous réduire le nombre de fichiers recherchés? Par exemple, lorsque je n'ai besoin de rechercher dans les fichiers source qu'un seul exécutable (parmi plusieurs dans un projet), je nourris grep les noms à partir d'une commande qui répertorie les fichiers source de ce programme:

grep expression `sources myprogram`

sources est un programme spécifique à mon environnement de développement mais vous pouvez avoir (ou être capable de construire) quelque chose d'équivalent.

Je suppose que vous avez essayé des techniques évidentes telles que

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

J'ai lu une suggestion selon laquelle l' -Poption de courant greppeut accélérer considérablement les recherches.


1
La localisation AFAIK est réservée aux noms de fichiers. recoll fonctionnerait, mais je préférerais un outil en ligne de commande. La base de code est assez grande, et comme je cherche une chaîne, je ne sais pas où elle se trouve, il est donc difficile de limiter le nombre de fichiers à rechercher :)
Peltier

Je pense que swish-e est en ligne de commande. Je n'en ai pas essayé (grep est assez rapide sur mes projets)
RedGrittyBrick

3

grep, non. Mais il existe plusieurs programmes qui utilisent des index et visent la base de code. ctags(il existe une version fournie avec vim), etags(destinée à être utilisée avec emacs), global(plus indépendante de l'éditeur) sont celle à laquelle je pense maintenant mais il y en a probablement d'autres.


J'utilise des ctags, mais n'est-ce pas limité à la recherche de noms de fonction? Je souhaite effectuer une recherche en texte intégral.
Peltier

Je suis à peu près sûr que ctag peut également rechercher la définition de classe et ISTR qu'il trouve également une certaine utilité. Je suis certain que global fait les deux. Mais il est vrai que ces outils ne font pas de recherche en texte intégral et utilisent les connaissances linguistiques pour limiter leur portée.
Programmeur

3

Vous pouvez copier votre base de code sur un disque RAM.


2

si vous souhaitez utiliser un moteur de recherche plein texte .. utilisez-en un:


C'est toujours une option, mais je me demandais s'il existait une option d'accélération grep plus légère, rapide et sale.
Peltier

'plus léger' mais 'voulez que mes trucs soient entièrement indexés' sont un peu de 2 extrêmes :) ctags est le meilleur match pour ce que vous voulez, si vous voulez juste aller vite et sale. avec tout le reste, vous finissez par utiliser un véritable moteur de recherche plein texte. Par exemple, «recoll» mentionné dans la réponse @RedGrittyBrick utilise xapian comme backend.
akira

1
Ils ne sont pas nécessairement incompatibles. Imaginez si ctags avait une option --full-text, par exemple, et grep une option --tag-file. Bien sûr, le fait qu'elle puisse exister ne signifie pas qu'elle existe :)
Peltier

-1

Non je ne pense pas. Mais il peut y avoir une solution simple: essayez ack. Je pense que si vous lui donnez une chance, vous le trouverez beaucoup plus rapide que grep, nécessite des chaînes de recherche plus courtes pour obtenir de meilleurs résultats de recherche et possède de nombreuses fonctionnalités souhaitables, tout en utilisant à peu près les mêmes commutateurs de commande. Une chose qui le rend plus rapide (bien que non indexé) est qu'il ignore beaucoup plus de choses que vous ne voulez pas rechercher. Il est écrit en Perl et utilise les expressions régulières de Perl (et dispose donc également de ports Mac et Windows).

http://betterthangrep.com/


Ack est plutôt cool. Mais je doute vraiment que ce soit plus rapide que grep, car il est basé sur les mêmes mécanismes.
Peltier
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.