`grep`、`egrep` 和 `fgrep` 之间有什么区别?

Vis*_*lvi 294 grep regular-expression

谁能告诉我grep, egrep, 和之间的技术差异fgrep并提供合适的示例?

我什么时候需要使用grepover egrep,反之亦然?

Cal*_*leb 317

从历史上看,这些开关是在单独的二进制文件中提供的。在一些非常老的 Unix 系统上,你会发现你需要调用单独的二进制文件,但在所有现代系统上,开关是首选。grep 的手册页有关于这方面的详细信息。

至于他们做什么,-E将 grep 切换到特殊模式,以便将表达式评估为 ERE(扩展正则表达式)而不是其正常模式匹配。此语法的详细信息在手册页上。

-E, --extended-regexp
将 PATTERN 解释为扩展的正则表达式

-F开关切换的grep进入它接受匹配模式,但随后拆分该图案成每行一个搜索字符串并执行一个或任何字符串的搜索而不做任何特殊模式匹配不同的模式。

-F, --fixed-strings
将 PATTERN 解释为由换行符分隔的固定字符串列表,其中任何一个都将被匹配。

以下是一些示例场景:

  • 您有一个文件,其中包含一个纯文本格式的 10 个 Unix 用户名列表。您想在您的机器上搜索组文件以查看列出的十个用户中的任何一个是否属于任何特殊组:

    grep -F -f user_list.txt /etc/group
    
    Run Code Online (Sandbox Code Playgroud)

    -F开关在这里有帮助的原因是模式文件中的用户名被解释为纯文本字符串。例如,点将被解释为点而不是通配符。

  • 您想使用花哨的表达式进行搜索。例如,括号()可用于指示|用作 OR 运算符的组。您可以使用-E以下命令运行此搜索:

    grep -E '^no(fork|group)' /etc/group
    
    Run Code Online (Sandbox Code Playgroud)

    ...返回以“nofork”或“nogroup”开头的行。如果没有-E开关,您将不得不转义所涉及的特殊字符,因为使用正常模式匹配,他们只会搜索该确切模式;

    grep '^no\(fork\|group\)' /etc/group
    
    Run Code Online (Sandbox Code Playgroud)

  • 有些系统没有 `egrep` 或 `fgrep`;`-E` 和 `-F` 是标准的。`egrep` 中实际上存在一些小的不兼容性:它对 `{` 的处理略有不同。 (19认同)
  • `fgrep` 使用 Aho-Corasick 后端,而 `grep` 使用 Commentz-Walter 的修改版本。这意味着 `grep` 的最坏情况为 O(mn) 复杂度,而 `fgrep` 的最坏情况为 O(m+n)。 (4认同)
  • Gilles "au contraaire mon capan",某些系统(可能较旧)可能没有标准 grep 的 -F 选项,但有 fgrep,有些人在我发现的有关将 grep 用于特殊字符的原始线程中抱怨这一点 (2认同)

roz*_*acz 33

来自man grep

 egrep 与 grep -E 相同。
 fgrep 与 grep -F 相同。直接调用 egrep 或  
  fgrep 已弃用,但提供以允许历史应用程序
  依赖它们未经修改地运行。

您使用fgreporgrep -F如果您希望将 grepped 字符串解释为模式。

您使用egrep或者grep -E如果您需要使用扩展的正则表达式。


Sté*_*nez 16

egrepfgrep基本上等价于grep -Egrep -F(分别):

   -E, --extended-regexp
          Interpret PATTERN as an extended regular  expression  (ERE,  see
          below).  (-E is specified by POSIX.)

   -F, --fixed-strings
          Interpret  PATTERN  as  a  list  of  fixed strings, separated by
          newlines, any of which is to be matched.  (-F  is  specified  by
          POSIX.)
Run Code Online (Sandbox Code Playgroud)

不过,错误消息可能会有所不同。

  • 好的,但是什么是扩展正则表达式?下面真的不解释了。举几个例子就好了…… (3认同)

Ruf*_*ufo 8

来自“男人 grep”:

可以使用三个变体程序 egrep、fgrep 和 rgrep。egrep 与 grep -E 相同。fgrep 与 grep -F 相同。rgrep 与 grep -r 相同。不推荐使用 egrep 或 fgrep 的直接调用,但提供它是为了允许依赖它们的历史应用程序不加修改地运行。

  • 这个问题要求一个合适的例子。 (2认同)