使用索引使grep更快?


10

我发现自己一遍又一遍地重复相同的代码库。虽然效果很好,但是每个命令大约需要10秒钟,因此我正在考虑提高其速度的方法。

那么可以grep使用某种索引吗?我知道索引对于复杂的正则表达式可能无济于事,但我主要使用非常简单的模式。这种情况下是否存在索引器?

编辑:我了解ctags之类的东西,但我想进行全文搜索。


您是否对grep或某些类似的find / xargs使用递归运算?
2011年

@Michał:是的,-R
Peltier,

Answers:


4

cscope呢,这和你的鞋子匹配吗?

允许搜索以下代码:

  • 所有对符号的引用
  • 全局定义
  • 函数调用的函数
  • 函数调用函数
  • 文字字串
  • 正则表达式模式
  • 一份文件
  • 文件包括文件

那可能就是我想要的,我来看一下。谢谢!
珀尔帖

看起来它对C(也许是C ++和Java)非常有效
neves

4

全文索引

有诸如recollswish-esphinx之类的工具,但您必须检查它们是否可以支持所需的搜索条件。

雷科尔

Recoll是用于Unix / Linux的个人全文搜索工具。

Swish-e

Swish-e是一个快速,灵活,免费的开源系统,用于索引网页或其他文件的集合。

狮身人面像

使用Sphinx,您可以快速轻松地批量索引和搜索存储在SQL数据库,NoSQL存储中的数据,或仅搜索文件

grep

令我惊讶的是,grep如此之慢,可以减少正在搜索的文件数量吗?例如,当我只需要在源文件中搜索一个可执行文件时(一个项目中有许多可执行文件),我从列出该程序源文件的命令中为grep提供名称:

grep expression `sources myprogram`

sources 是特定于我的开发环境的程序,但您可能具有(或能够构建)等效的程序。

我假设您尝试了一些显而易见的技术,例如

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

我读过一条建议,即使用-Pcurrent选项grep可以显着加快搜索速度。


1
AFAIK查找仅适用于文件名。recoll可以工作,但是我更喜欢命令行工具。代码库很大,而且由于我要查找字符串,所以我不知道它在哪里,因此很难限制要搜索的文件数:)
Peltier

我认为swish -e是命令行。我还没有尝试过(grep在我的项目中足够快)
RedGrittyBrick 2011年

3

grep,不。但是,有一些程序使用索引并针对代码库。ctags(vim提供了一个版本),etags(旨在与emacs一起使用),global(更独立于编辑器)是我现在正在考虑的版本,但可能还有其他版本。


我使用ctags,但不仅限于搜索函数名称吗?我想进行全文搜索。
珀尔帖

我很确定ctag还能搜索类定义和ISTR,它也可以找到一些用处。我敢肯定,Global会同时做到。但是,这些工具确实不进行全文搜索,而是使用语言知识来限制其范围。
2011年

3

您可以将代码库复制到RAM磁盘上。


2

如果要使用全文本搜索引擎,请使用以下一种:


这始终是一个选择,但是我想知道是否会存在一个更轻量,更快和更脏的grep加速选项。
珀尔帖

“更轻巧”但“想完全索引我的内容”是两个极端:)如果您只是想快速变脏,ctags是您想要的最佳匹配。最终,您将使用真正的全文搜索引擎。例如,@ RedGrittyBrick答案中提到的'recoll'是使用xapian作为后端。
akira

1
它们不一定是不兼容的。想象一下,例如ctags是否具有--full-text选项,而grep具有--tag-file选项。当然,它可能存在的事实并不意味着它确实存在:)
Peltier

-1

不,我不这么认为。但是,可能有一个简单的解决方案:尝试ack。我认为,如果有机会,您会发现它比grep快得多,它需要较短的搜索字符串才能获得更好的搜索结果,并且具有许多理想的功能,同时使用的命令开关几乎相同。使速度更快(尽管未编制索引)的一件事是,它忽略了许多您不想搜索的内容。它是用Perl编写的,并使用Perl的正则表达式(因此也具有Mac和Windows端口)。

http://betterthangrep.com/


阿克很酷。但是我真的怀疑它是否比grep更快,因为它基于相同的机制。
珀尔帖(Peltier)2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.