it-swarm.cn

grep,egrep和fgrep有什么区别?

谁能告诉我grepegrepfgrep之间的技术差异并提供合适的示例?

什么时候需要在grep上使用egrep,反之亦然?

287
mr_eclair

从历史上看,这些开关是在单独的二进制文件中提供的。在某些非常老的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
    _
304
Caleb

来自man grep

 egrep与grep -E相同。
 fgrep与grep -F相同。不建议使用egrep或
 fgrep直接调用,但提供了直接调用,以允许依赖它们的历史应用程序
未经修改即可运行。

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

您使用egrepgrep -E(如果您需要使用扩展的正则表达式)。

33
rozcietrzewiacz

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

错误消息可能有所不同。

15
Stéphane Gimenez

来自“ man grep”:

提供了三个变体程序,例如:rep,fgrep和rgrep。 egrep与grep -E相同。 fgrep与grep -F相同。 rgrep与grep -r相同。不建议使用egrep或fgrep的直接调用,但是提供了直接调用,以允许依赖它们的历史应用程序不经修改地运行。

8
Rufo El Magufo

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

至于egrep和grep之间的区别,我认为egrep通常是您想要的东西。 GNU手动站点 列出了grep和egrep之间的区别,这似乎在于语法:有些东西需要斜杠,而另一些不需要。我认为egrep更加与Perl正则表达式和javascript正则表达式“兼容”,因此对我来说,使用egrep更容易。

顺便说一句。我真的鼓励您尝试 ack -它支持PREG,并且具有更多有用的默认值(例如,着色,跳过.svn等可能不需要的目录,遵循符号链接的功能,并且输入ack比grep -E容易一些。

3
qbolec