“部分grep”加速grep速度?

时间:2015-08-19 15:08:40

标签: regex linux bash shell grep

这就是我的想法:grep程序尝试模式匹配行中的每个模式,如:

echo "abc abc abc" | grep abc --color

结果是三个abc都是红色的,所以grep做了一个与该线匹配的完整模式。

但是想想在这种情况下,我有很多大文件要处理,但我感兴趣的词很可能出现在前几个单词中。我的工作是找到没有文字的行。因此,如果grep程序在找到单词时可以继续到下一行而不必检查其余行,则可能会明显更快。

grep中是否有partial match选项可以执行此操作?

像:

echo abc abc abc | grep --partial abc --color

只有第一个abc红色。

3 个答案:

答案 0 :(得分:3)

请参阅grep internals的这个很好的介绍:

http://lists.freebsd.org/pipermail/freebsd-current/2010-August/019310.html

特别是:

  

GNU grep AVOIDS突破输入线。寻找换行符   将grep减慢几倍,因为找到了   新行必须查看每个字节!

     

因此,GNU grep不是使用面向行的输入,而是将原始数据读入   一个大缓冲区,使用Boyer-Moore搜索缓冲区,并且仅在   它找到匹配它去寻找边界换行符。   (某些命令行选项,如-n禁用此优化。)

所以答案是:否。grep寻找下一次搜索字符串的速度要快得多,而不是寻找新的一行。

编辑:关于对color=never的评论中的推测可以解决问题:我快速浏览了一下源代码。如果找到匹配项,则在实际搜索正则表达式或前一个和即将到来的换行符附近的任何地方都不使用变量color_option

搜索这些行终结符时,可能会节省几个CPU周期。可能真实的世界差异显示出病态的长行和非常短的搜索字符串。

答案 1 :(得分:1)

如果你的工作是找到没有单词的行,你可以尝试 sed 删除包含特定单词的行。

sed '/word/d' input_file

当在当前行找到第一个匹配项时,Sed可能会继续到下一行。

答案 2 :(得分:0)

如果要查找没有特定单词的行,可以使用grep执行此操作。

尝试grep -v "abc",这意味着反过来。在这种情况下,找到没有字符串" abc"。

的行

如果我有一个看起来像这样的文件:

line one abc
line two abc
line three def

执行grep -v "abc" file.txt将返回line three def