Используя индекс, чтобы сделать grep быстрее?

10

Я обнаруживаю, что снова и снова повторяю одну и ту же кодовую базу. Хотя это прекрасно работает, каждая команда занимает около 10 секунд, поэтому я думаю о том, как сделать это быстрее.

Так можно grepиспользовать какой-то индекс? Я понимаю, что индекс, вероятно, не поможет сложным регулярным выражениям, но я использую в основном очень простые шаблоны. Существует ли индексатор для этого случая?

РЕДАКТИРОВАТЬ: я знаю о ctags и тому подобное, но я хотел бы сделать полнотекстовый поиск.

Пельтье
источник
Используете ли вы рекурсивную опцию для grep или что-то вроде find / xargs?
Михал Шрайер
@ Михал: да, -R
Пельтье

Ответы:

4

а как насчет cscope , это соответствует вашей обуви?

Позволяет искать код для:

  • все ссылки на символ
  • глобальные определения
  • функции, вызываемые функцией
  • функции, вызывающие функцию
  • текстовая строка
  • шаблон регулярного выражения
  • файл
  • файлы, включая файл
Акира
источник
Это может быть то, что я ищу, я посмотрю. Спасибо!
Пельтье
Похоже, что это просто хорошо работает для C, может быть, C ++ и Java
Neves
4

Полнотекстовая индексация

Существуют такие инструменты, как recoll , swish-e и sphinx, но вам нужно проверить, могут ли они поддерживать необходимый вам критерий поиска.

Recoll

Recoll - это личный инструмент полнотекстового поиска для Unix / Linux.

Swish-е

Swish-e - это быстрая, гибкая и бесплатная система с открытым исходным кодом для индексации коллекций веб-страниц или других файлов.

сфинкс

Sphinx позволяет вам быстро и легко либо выполнять пакетный индекс и искать данные, хранящиеся в базе данных SQL, хранилище NoSQL, либо просто файлы.

Grep

Я удивлен, что grep работает так медленно, как вы описываете, можете ли вы уменьшить количество файлов, в которых ведется поиск? Например, когда мне нужно искать только в исходных файлах один исполняемый файл (из многих в проекте), я передаю grep имена из команды, в которой перечислены исходные файлы для этой программы:

grep expression `sources myprogram`

sources это программа, специфичная для моей среды разработки, но вы можете иметь (или иметь возможность создать) что-то эквивалентное.

Я предполагаю, что вы пробовали очевидные методы, такие как

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

Я прочитал предположение, что -Pопция current grepможет значительно ускорить поиск.

RedGrittyBrick
источник
1
AFAIK locate только для имен файлов. recoll будет работать, но я бы предпочел инструмент командной строки. База кода довольно большая, и так как я ищу строку, я не знаю, где она находится, поэтому трудно ограничить количество файлов для поиска :)
Peltier
Я думаю, что swish-e - это командная строка. Я не пробовал (grep достаточно быстр для моих проектов)
RedGrittyBrick
3

grep, нет. Но есть несколько программ, которые используют индексы и нацелены на кодовую базу. ctags(есть версия, поставляемая с vim), etags(предназначенная для использования с emacs), global(более независимая от редактора) - это та, о которой я думаю сейчас, но, возможно, есть и другая.

AProgrammer
источник
Я использую ctags, но разве это не ограничивается поиском по именам функций? Я хочу сделать полнотекстовый поиск.
Пельтье
Я почти уверен, что ctag может также искать определение класса и ISTR, что также может найти применение. Я уверен, что глобальный делает оба. Но это правда, что эти инструменты не выполняют полнотекстовый поиск и используют знание языка, чтобы ограничить область их применения.
AProgrammer
3

Вы можете скопировать свою кодовую базу на RAM-диск.

jfg956
источник
2

если вы хотите использовать систему полнотекстового поиска .. используйте один:

Акира
источник
Это всегда вариант, но мне было интересно, существует ли более легкий, быстрый и грязный вариант ускорения grep.
Пельтье
«более легкие», но «хотят, чтобы мои материалы были полностью проиндексированы» - это всего лишь 2 крайности :) ctags - лучшее совпадение с тем, что вы хотите, если вы просто хотите быстро испачкаться. со всем остальным вы используете настоящую поисковую систему с полным текстом. Например, 'recoll', упомянутый в ответе @RedGrittyBrick, использует xapian в качестве бэкэнда.
Акира
1
Они не обязательно несовместимы. Представьте, например, что в ctags есть опция --full-text, а в grep опция --tag-file. Конечно, тот факт, что он может существовать, не означает, что он существует :)
Пельтье
-1

Нет, я так не думаю. Но может быть простое решение: попробуйте ack. Я думаю, что если вы дадите ему шанс, вы обнаружите, что он значительно быстрее, чем grep, требует более коротких строк поиска, чтобы получить лучшие результаты поиска, и имеет много желаемых функций, в то же время используя почти те же переключатели команд. Одна вещь, которая делает его более быстрым (хотя и не индексируемым), заключается в том, что он игнорирует гораздо больше вещей, которые вы не хотите искать. Он написан на Perl и использует регулярные выражения Perl (и, следовательно, также имеет порты Mac и Windows).

http://betterthangrep.com/

Майк из Шривпорта
источник
Ack довольно круто. Но я действительно сомневаюсь, что это немного быстрее, чем grep, поскольку он основан на тех же механизмах.
Пельтье