Używasz indeksu, aby przyspieszyć grep?

10

Ciągle przeszukuję tę samą bazę kodów. Chociaż działa świetnie, każde polecenie zajmuje około 10 sekund, więc myślę o sposobach przyspieszenia.

Czy można grepużyć jakiegoś indeksu? Rozumiem, że indeks prawdopodobnie nie pomoże w przypadku skomplikowanych wyrażeń regularnych, ale używam głównie bardzo prostych wzorców. Czy istnieje indeksator dla tego przypadku?

EDYCJA: Znam ctagi i tym podobne, ale chciałbym przeprowadzić wyszukiwanie pełnotekstowe.

Peltier
źródło
Czy używasz opcji rekurencyjnej dla grep lub jakiegoś sposobu find / xargs?
Michał Šrajer,
@ Michał: tak, -R
Peltier

Odpowiedzi:

4

co z cscope , czy to pasuje do twoich butów?

Umożliwia wyszukiwanie kodu dla:

  • wszystkie odniesienia do symbolu
  • globalne definicje
  • funkcje wywoływane przez funkcję
  • funkcje wywołujące funkcję
  • Ciąg tekstowy
  • wzór wyrażenia regularnego
  • plik
  • pliki, w tym plik
akira
źródło
To może być to, czego szukam, spojrzę. Dzięki!
Peltier
Wygląda na to, że działa dobrze dla C, może C ++ i Java
2017
4

Indeksowanie pełnotekstowe

Istnieją narzędzia takie jak recoll , swish-e i sfinks, ale musisz sprawdzić, czy mogą one obsługiwać potrzebne kryteria wyszukiwania.

Przypomnij

Recoll to osobiste narzędzie do wyszukiwania pełnotekstowego dla systemów Unix / Linux.

Swish-e

Swish-e to szybki, elastyczny i darmowy system open source do indeksowania kolekcji stron internetowych lub innych plików.

Sfinks

Sphinx umożliwia indeksowanie i wyszukiwanie danych przechowywanych w bazie danych SQL, pamięci NoSQL lub po prostu w plikach szybko i łatwo

grep

Dziwi mnie, że grep działa tak wolno, jak to opisujesz. Czy możesz zmniejszyć liczbę przeszukiwanych plików? Na przykład, gdy muszę tylko przeszukać pliki źródłowe w poszukiwaniu jednego pliku wykonywalnego (spośród wielu w projekcie), podaję grep nazwy z polecenia, które wyświetla listę plików źródłowych dla tego programu:

grep expression `sources myprogram`

sources to program specyficzny dla mojego środowiska programistycznego, ale możesz mieć (lub być w stanie zbudować) coś równoważnego.

Zakładam, że wypróbowałeś oczywiste techniki, takie jak

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

Czytałem sugestię, że -Popcja prądu grepmoże znacznie przyspieszyć wyszukiwanie.

RedGrittyBrick
źródło
1
Lokalizacja AFAIK dotyczy tylko nazw plików. recoll działałby, ale wolałbym narzędzie wiersza poleceń. Baza kodu jest dość duża, a ponieważ szukam łańcucha, nie wiem, gdzie on jest, więc trudno jest ograniczyć liczbę plików do przeszukania :)
Peltier
Myślę, że swish-e to linia poleceń. Jeszcze nie próbowałem (grep jest wystarczająco szybki w moich projektach)
RedGrittyBrick
3

grep, nie. Ale istnieje kilka programów, które używają indeksów i mają na celu bazę kodu. ctags(istnieje wersja dostarczana z vimem), etags(przeznaczone do użycia z emacsem), global(bardziej niezależne od edytora) to ta, o której teraz myślę, ale prawdopodobnie są inne.

AProgrammer
źródło
Używam tagów, ale czy nie jest to ograniczone do wyszukiwania nazw funkcji? Chcę przeprowadzić wyszukiwanie pełnotekstowe.
Peltier,
Jestem prawie pewien, że ctag może także wyszukiwać definicje klas i ISTR, że to też się przydaje. Jestem pewien, że globalny robi jedno i drugie. Ale prawdą jest, że narzędzia te nie przeprowadzają wyszukiwania pełnotekstowego i wykorzystują znajomość języka, aby ograniczyć ich zakres.
AProgrammer
3

Możesz skopiować bazę kodów na dysk RAM.

jfg956
źródło
2

jeśli chcesz użyć wyszukiwarki pełnotekstowej .. użyj jednej:

akira
źródło
To zawsze jest opcja, ale zastanawiałem się, czy istnieje bardziej lekka, szybka i brudna opcja przyspieszenia grep.
Peltier
„bardziej lekki”, ale „chcę mieć pełne indeksowanie moich rzeczy” to trochę 2 skrajności :) ctags to najlepsze dopasowanie do tego, czego chcesz, jeśli chcesz po prostu szybko i bezczelnie. wszystko inne kończy się na prawdziwej wyszukiwarce pełnotekstowej. np. „recoll” wspomniany w odpowiedzi @RedGrittyBrick używa xapian jako backendu.
akira,
1
Niekoniecznie są niezgodne. Wyobraź sobie, że ctags ma na przykład opcję --full-text, a grep opcję --tag-file. Oczywiście fakt, że mógł istnieć, nie oznacza, że ​​tak jest :)
Peltier,
-1

Nie, nie sądzę. Ale może być proste rozwiązanie: spróbuj potwierdzić. Myślę, że jeśli dasz temu szansę, znajdziesz ją znacznie szybciej niż grep, wymaga krótszych ciągów wyszukiwania, aby uzyskać lepsze wyniki wyszukiwania, i ma wiele pożądanych funkcji, przy użyciu tych samych przełączników poleceń. Jedną z rzeczy, która sprawia, że ​​jest szybszy (choć nie indeksowany) jest to, że ignoruje o wiele więcej rzeczy, których nie chcesz przeszukiwać. Jest napisany w Perlu i używa wyrażeń regularnych Perla (a zatem ma również porty Mac i Windows).

http://betterthangrep.com/

Mike z Shreveport
źródło
Ack jest całkiem fajny. Ale naprawdę wątpię, żeby było to szybsze niż grep, ponieważ opiera się na tych samych mechanizmach.
Peltier