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.


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

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.


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.


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


2

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


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/


Ack jest całkiem fajny. Ale naprawdę wątpię, żeby było to szybsze niż grep, ponieważ opiera się na tych samych mechanizmach.
— Peltier
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.