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

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

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

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

答案1

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

至于它们的作用,-E将 grep 切换到特殊模式,以便将表达式计算为 ERE(扩展正则表达式),而不是其正常模式匹配。该语法的详细信息位于手册页上。

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

-F开关将 grep 切换到另一种模式,它接受要匹配的模式,但随后将该模式拆分为每行一个搜索字符串,并对任何字符串进行 OR 搜索,而不进行任何特殊的模式匹配。

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

以下是一些示例场景:

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

    grep -F -f user_list.txt /etc/group
    

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

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

    grep -E '^no(fork|group)' /etc/group
    

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

    grep '^no\(fork\|group\)' /etc/group
    

答案2

man grep

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

你使用fgrep或者grep -F如果你希望 grep 字符串被解释为模式。

如果需要使用扩展正则表达式,则可以使用egrepor 。grep -E

答案3

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.)

但错误消息可能有所不同。

答案4

如果您搜索逐字字符串,并且希望确保您传递的字符串被逐字解释(即不冒点或问号被解释为其他内容的风险),请使用 fgrep 或 egrep -F。

至于 egrep 和 grep 之间的区别,我认为 egrep 大多数时候就是您想要的东西。 GNU 手册站点列出了 grep 和 egrep 之间的差异,这些差异似乎在于语法:有些东西需要斜杠,而另一些则不需要。我认为egrep与perl正则表达式和javascript正则表达式更“兼容”,因此我更容易使用egrep。

顺便提一句。我真的鼓励你给予确认尝试一下 - 它支持 PREG,并且具有更有用的默认设置(即着色、跳过可能不是您想要的目录(如 .svn)、跟踪符号链接的能力,以及输入 ack 比 grep -E 更容易一些)。

相关内容