Verwenden Sie einen Index, um grep schneller zu machen?

10

Ich stelle fest, dass ich immer wieder dieselbe Codebasis greife. Obwohl es großartig funktioniert, dauert jeder Befehl ungefähr 10 Sekunden, daher denke ich darüber nach, wie ich ihn schneller machen kann.

So kann grepeine Art von Index verwenden? Ich verstehe, dass ein Index bei komplizierten regulären Ausdrücken wahrscheinlich nicht hilft, aber ich verwende meistens sehr einfache Muster. Gibt es für diesen Fall einen Indexer?

EDIT: Ich kenne mich mit ctags und dergleichen aus, möchte aber eine Volltextsuche durchführen.

Peltier
quelle
Verwenden Sie rekursive Optionen für grep oder eine ähnliche Methode wie find / xargs?
Michał Šrajer
@ Michał: ja, -R
Peltier

Antworten:

4

Was ist mit cscope ? Passt das zu Ihren Schuhen?

Ermöglicht die Suche nach:

  • alle Verweise auf ein Symbol
  • globale Definitionen
  • Funktionen, die von einer Funktion aufgerufen werden
  • Funktionen, die eine Funktion aufrufen
  • Textzeichenfolge
  • Muster für reguläre Ausdrücke
  • eine Datei
  • Dateien einschließlich einer Datei
Akira
quelle
Das könnte das sein, wonach ich suche, ich werde einen Blick darauf werfen. Vielen Dank!
Peltier
Es sieht so aus, als ob es nur gut für C funktioniert, vielleicht für C ++ und Java
neves
4

Volltextindizierung

Es gibt Werkzeuge , wie recoll , Swish-e und Sphinx , aber man müsste prüfen , ob sie die Art von Suchkriterien unterstützen , die Sie benötigen.

Recoll

Recoll ist ein persönliches Volltextsuchwerkzeug für Unix / Linux.

Swish-e

Swish-e ist ein schnelles, flexibles und kostenloses Open Source-System zum Indizieren von Sammlungen von Webseiten oder anderen Dateien.

Sphinx

Mit Sphinx können Sie entweder Batch-Index und Suchdaten, die in einer SQL-Datenbank oder einem NoSQL-Speicher gespeichert sind, oder nur Dateien schnell und einfach speichern

grep

Ich bin überrascht, dass grep so langsam ist, wie Sie es beschreiben. Können Sie die Anzahl der durchsuchten Dateien reduzieren? Wenn ich zum Beispiel nur die Quelldateien nach einer ausführbaren Datei durchsuchen muss (von vielen in einem Projekt), gebe ich grep die Namen von einem Befehl ein, der die Quelldateien für dieses Programm auflistet:

grep expression `sources myprogram`

sources ist ein Programm, das für meine Entwicklungsumgebung spezifisch ist, aber Sie haben möglicherweise etwas Äquivalentes (oder können es erstellen).

Ich gehe davon aus, dass Sie offensichtliche Techniken wie ausprobiert haben

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

Ich habe einen Vorschlag gelesen , dass die -POption "Aktuell" grepdie Suche erheblich beschleunigen kann.

RedGrittyBrick
quelle
1
AFAIK-Lokalisierung ist nur für Dateinamen. recoll würde funktionieren, aber ich würde ein Kommandozeilen-Tool bevorzugen. Die Codebasis ist ziemlich groß, und da ich nach einer Zeichenfolge suche, weiß ich nicht, wo sie sich befindet. Daher ist es schwierig, die Anzahl der zu durchsuchenden Dateien zu begrenzen :)
Peltier
Ich denke, swish-e ist Kommandozeile. Ich habe noch keine ausprobiert (grep ist bei meinen Projekten schnell genug)
RedGrittyBrick
3

grep, nein. Es gibt jedoch mehrere Programme, die Indizes verwenden und auf die Codebasis abzielen. ctags(Es gibt eine Version, die mit vim bereitgestellt wird) etags(für die Verwendung mit Emacs vorgesehen) global(unabhängiger vom Editor) sind die, an die ich gerade denke, aber es gibt wahrscheinlich andere.

Ein Programmierer
quelle
Ich verwende ctags, aber ist das nicht auf die Suche nach Funktionsnamen beschränkt? Ich möchte eine Volltextsuche durchführen.
Peltier
Ich bin mir ziemlich sicher, dass ctag auch nach Klassendefinitionen und ISTR suchen kann, die ebenfalls Verwendung finden. Ich bin sicher, dass Global beides kann. Es ist jedoch richtig, dass diese Tools keine Volltextsuche durchführen und Sprachkenntnisse verwenden, um ihren Umfang einzuschränken.
AProgrammer
3

Sie können Ihre Codebasis auf eine RAM-Disk kopieren.

jfg956
quelle
2

Wenn Sie eine Volltextsuchmaschine verwenden möchten, verwenden Sie eine:

Akira
quelle
Das ist immer eine Option, aber ich habe mich gefragt, ob es eine leichtere, schnellere und schmutzigere Grep-Beschleunigungsoption geben würde.
Peltier
"Leichter", aber "Ich möchte, dass meine Sachen vollständig indiziert sind" sind ein bisschen 2 Extreme :) ctags ist die beste Übereinstimmung für das, was Sie wollen, wenn Sie nur schnell und schmutzig werden wollen. Bei allem anderen verwenden Sie eine echte Volltextsuchmaschine. Beispiel: 'recoll', das in der Antwort von @RedGrittyBrick erwähnt wird, verwendet xapian als Backend.
Akira
1
Sie sind nicht unbedingt inkompatibel. Stellen Sie sich vor, ctags hätten zum Beispiel die Option --full-text und grep eine Option --tag-file. Natürlich bedeutet die Tatsache, dass es existieren könnte, nicht, dass es existiert :)
Peltier
-1

Nein, das glaube ich nicht. Aber es kann eine einfache Lösung geben: Versuchen Sie es mit ack. Ich denke, wenn Sie ihm eine Chance geben, werden Sie es deutlich schneller als grep finden, kürzere Suchzeichenfolgen benötigen, um bessere Suchergebnisse zu erzielen, und viele wünschenswerte Funktionen bei Verwendung der gleichen Befehlsschalter. Eine Sache, die es schneller macht (obwohl nicht indiziert), ist, dass es viel mehr von den Dingen ignoriert, die Sie nicht suchen möchten. Es ist in Perl geschrieben und verwendet die regulären Ausdrücke von Perl (und verfügt daher auch über Mac- und Windows-Ports).

http://betterthangrep.com/

Mike aus Shreveport
quelle
Ack ist ziemlich cool. Aber ich bezweifle wirklich, dass es schneller als grep ist, da es auf denselben Mechanismen basiert.
Peltier