【问题标题】:"partial grep" to accelerate grep speed?“部分grep”加快grep速度?
【发布时间】:2015-08-19 15:08:39
【问题描述】:

这就是我的想法:grep 程序尝试对行中出现的每个模式进行模式匹配,就像:

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

结果是三个abc 都是红色的,所以 grep 对该行进行了完整的模式匹配。

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

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

喜欢:

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

只有第一个 abc 是红色的。

【问题讨论】:

  • grep 检查整​​行的唯一原因可能是因为您使用的是--color。如果grep 在没有它的第一场比赛之后还没有停止,我会感到惊讶,因为无论abc 在该行中匹配多少次,该行都将成为输出的一部分。
  • 正如@chepner 提到的,考虑添加--color=never 以禁用着色。

标签: regex linux bash shell grep


【解决方案1】:

请参阅这篇关于 grep 内部的精彩介绍:

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

特别是:

GNU grep 避免将输入分成几行。寻找换行符 将 grep 减慢几倍,因为要找到 换行它必须查看每个字节!

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

所以答案是:不。grep 查找搜索字符串的下一个匹配项比查找新行要快得多。

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

在搜索这些行终止符时,可能会节省一些 CPU 周期。现实世界的差异可能会出现病态的长行和非常短的搜索字符串。

【讨论】:

    【解决方案2】:

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

    sed '/word/d' input_file
    

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

    【讨论】:

      【解决方案3】:

      如果你想查找没有特定单词的行,你可以使用 grep 来做到这一点。

      试试grep -v "abc",这意味着做相反的事情。在这种情况下,查找没有字符串“abc”的行。

      如果我有一个如下所示的文件:

      line one abc
      line two abc
      line three def
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-07-14
        • 2013-03-20
        • 2012-02-22
        • 2020-12-07
        • 1970-01-01
        • 2019-03-29
        • 2011-12-29
        相关资源
        最近更新 更多