Grep内部工作原理

时间:2014-06-12 20:06:39

标签: linux bash grep internals

我想知道grep内部如何运作。具体来说,我想知道找到第一场比赛是否比找到所有比赛要快得多?例如,第一次匹配发生在从开始的文件的10%点,所有匹配遍布整个文件。然后我认为找到第一个匹配只会使grep处理文件内容少于查找所有匹配(在这种情况下grep必须遍历整个文件,相比之前的情况下文件的10%) 。我想知道我的假设是否正确,因为这种可能的改进可以极大地改善我的处理工作。 谢谢。

2 个答案:

答案 0 :(得分:3)

如果您使用grep打印文件中的所有匹配行,那么它当然必须处理整个文件。

另一方面,如果您至少找到一个匹配项,则使用grep -q生成成功的终止状态,那么当然grep可以在第一场比赛时停止。如果在文件的早期找到第一个匹配项,则可以节省时间,因为grep可以立即退出并返回成功的终止状态。如果文件中没有匹配(最坏的情况),那么它必须处理整个文件。在这种情况下它必须处理整个文件,因为它怎么能确定没有匹配?如果只在最后一行发生匹配,但grep忽略该行,那么它将错误地报告没有匹配。

Grep将模式编译为正则表达式。正则表达式的结构存在性能影响。一些正则表达式比其他表达式更好。根据所使用的算法,一些看似很小的正则表达式可以生成具有大量状态的状态机。

加速搜索的技术是索引。如果您经常在文本语料库中查找特定单词,那么如果您的单词索引指示在语料库中找到它们的位置,则会更快。索引的组织方式使得可以非常快速地检索找到单词的位置列表,而无需扫描文本。构建索引需要时间(需要对整个文本主体进行完整扫描),并且必须在语料库更改时重建索引。

这是加速通过计算机程序源代码(例如GNU Id-Utils)进行标识符搜索的工具的基础。当然,索引是Google等全球网络搜索引擎的基础。

答案 1 :(得分:1)

快速查看grep源代码(版本2.18),/src/main.c中有一个名为done_on_match的变量,如果设置,应该在第一次匹配后停止扫描。此变量在-l-L-q(以及可能还有其他人)上设置。所以,是的,搜索第一个匹配确实使grep比其他情况更早存在。

开头说过,我不清楚这会让你的处理速度更快,你的主要延迟可能仍然是文件I / O.

相关问题