Використовуючи індекс, щоб зробити grep швидше?


10

Мені здається, що він знову і знову стискає ту саму базу коду. Хоча це працює чудово, кожна команда займає близько 10 секунд, тому я роздумую над способами, як зробити це швидше.

Так може grepвикористовувати якийсь індекс? Я розумію, що індекс, ймовірно, не допоможе для складних регулярних виразів, але я використовую здебільшого дуже прості малюнки. Чи існує індексатор для цього випадку?

EDIT: Я знаю про теги та інше, але хотів би зробити повнотекстовий пошук.


Чи використовуєте ви рекурсивну оптику для grep чи якийсь спосіб пошуку / xargs?
Michał Šrajer

@ Michał: так, -R
Пельтьє

Відповіді:


4

як щодо cscope , чи відповідає це вашому взуттю?

Дозволяє шукати код для:

  • всі посилання на символ
  • глобальні визначення
  • функції, викликані функцією
  • функції, що викликають функцію
  • текстовий рядок
  • закономірний вираз шаблон
  • файл
  • файли, включаючи файл

Це може бути те, що я шукаю, я погляну. Дякую!
Пельтьє

Схоже, це просто добре працює для C, можливо, C ++ та Java
небіж

4

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

Є такі інструменти, як відмовка , swish-e та сфінкс, але вам доведеться перевірити, чи можуть вони підтримувати потрібні критерії пошуку.

Відновити

Recoll - це персональний повнотекстовий інструмент пошуку для Unix / Linux.

Swish-e

Swish-e - це швидка, гнучка та безкоштовна система з відкритим кодом для індексації колекцій веб-сторінок чи інших файлів.

Сфінкс

Sphinx дозволяє вам або пакетний індекс, і пошук даних, що зберігаються в базі даних SQL, сховищі NoSQL, або просто файли швидко і легко

греп

Я здивований, що греп працює так само повільно, як ви описуєте, чи можете ви зменшити кількість шуканих файлів? Наприклад, коли мені потрібно лише шукати вихідні файли по одному виконуваному файлу (з багатьох у проекті), я подаю греп-імена з команди, в якій перераховані вихідні файли для цієї програми:

grep expression `sources myprogram`

sources це програма, специфічна для мого середовища розробки, але ви можете мати (або вміти конструювати) щось еквівалентне.

Я припускаю, що ви спробували очевидні методи, такі як

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

Я прочитав пропозицію про те, що -Pопція струму grepможе значно прискорити пошук.


1
Пошук AFAIK призначений лише для імен файлів. відновлення спрацювало б, але я вважаю за краще інструмент командного рядка. База коду досить велика, і оскільки я шукаю рядок, я не знаю, де це, тому важко обмежити кількість файлів, які потрібно шукати :)
Peltier

Я думаю, що swish-e - це командний рядок. Я ще не пробував жодного (
греп

3

греп, ні. Але є кілька програм, які використовують індекси та спрямовані на кодову базу. ctags(є версія, що надається vim), etags(призначена для використання з emacs), global(більш незалежна від редактора) - це та, про яку я зараз думаю, але, ймовірно, є й інша.


Я використовую ctags, але це не обмежується пошуком імен функцій? Я хочу зробити повнотекстовий пошук.
Пельтьє

Я майже впевнений, що ctag може також шукати визначення класу та ISTR, що він також знайде певне використання. Я впевнений, що глобальний робить те і інше. Але це правда, що ці інструменти не здійснюють повнотекстовий пошук і використовують знання мови, щоб обмежити їх сферу застосування.
AProgrammer

3

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


2

якщо ви хочете скористатися повнотекстовою пошуковою системою .. використовуйте одну:


Це завжди варіант, але мені було цікаво, чи існуватиме більш легкий, швидкий та брудний варіант прискорення грепу.
Пельтьє

"більш легкий", але "хочете, щоб мої речі були повністю індексовані" - це трохи 2 крайнощі :). з усім іншим ви в кінцевому підсумку використовуєте справжню пошукову систему. наприклад, "відмовитися", згаданий у відповіді @RedGrittyBrick, використовує xapian як резервний.
акіра

1
Вони не обов'язково несумісні. Уявіть, якби у ctags була опція --full-text, наприклад, та grep - -tag-file. Звичайно, те, що воно могло існувати, не означає, що це так :)
Peltier

-1

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

http://betterthangrep.com/


Ack досить класно. Але я дуже сумніваюся, що це швидше, ніж греп, оскільки він заснований на тих же механізмах.
Пельтьє
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.