grep,egrep和fgrep有什么区别?


Answers:


292

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

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

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

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

-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
    

17
有些系统没有egrepfgrep; -E并且-F是标准的。实际上存在一些小的不兼容之处egrep:对待方式{略有不同。
吉尔斯

4
fgrep使用Aho-Corasick后端,而grep使用Commentz-Walter的修改版。这意味着grepO(mn)复杂度fgrep最差,而O(m + n)最差。
Slater Victoroff 2015年

2
Gilles“ au capire mon capitan”,某些系统(也许较旧)可能没有标准grep的-F选项,但具有fgrep,有些ppl抱怨我在原来关于grep用作特殊字符的原始线程上抱怨
THESorcerer

我最近偶然发现了Android系统上egrep,并grep -E通过不同的可执行文件,BusyBox的和BSD grep的进行处理。对于非Posix regex构造,这两个变体的行为有所不同,例如\s。这导致了很多混乱……
Lii

33

来自man grep

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

您可以使用fgrep或者grep -F如果你希望grepped字符串被解释为一种模式。

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


13

egrep并且fgrep基本上等同于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.)

错误消息可能有所不同。


2
好了,但什么一个扩展的正则表达式?下面并没有真正解释。几个例子会很好...
同构

@isomorphismes:这个Wikibooks 链接很好地解释了它
zb226 '16

8

来自“ man grep”:

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


2
问题要求一个合适的例子。
同构

3

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

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

顺便说一句。我真的鼓励你给ACK一个尝试-它支持半固化片,并有更多的有用的默认值(即着色,跳过可能-不什么,你想目录,如.svn文件,要遵循符号链接的能力,这是一个有点容易输入ack比grep -E)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.