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

评论

超级用户很好地说明了grep,egrep,fgrep和pgrep之间的区别:superuser.com/questions/508881/…

#1 楼



egrepgrep -E是100%等效

fgrepgrep -F是100%等效


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

关于它们的作用,-E将grep切换到一种特殊模式,因此该表达式被评估为ERE(扩展正则表达式),而不是其常规模式匹配。有关此语法的详细信息,请参见手册页。


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


-F开关grep进入另一种模式,在该模式下它接受匹配的模式,然后将该模式分成每行一个搜索字符串,并在不进行任何特殊模式匹配的情况下对任意字符串进行“或”搜索。


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


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

模式文件中的用户名被解释为纯文本字符串。例如,点将被解释为点而不是通配符。


您想使用精美的表达式进行搜索。例如,括号-F可用于表示将()用作OR运算符的组。您可以使用|运行此搜索:

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


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

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




评论


有些系统没有egrep或fgrep; -E和-F是标准配置。 egrep实际上实际上有一些小的不兼容之处:它对{的处理略有不同。

–吉尔斯'所以-不再是邪恶的'
2011年8月3日23:59

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

–胜者Victoroff
2015年6月26日20:53



吉尔斯(Gilles)“ au controire mon capitan”,某些系统(也许更旧)可能没有标准grep的-F选项,但具有fgrep,有些ppl抱怨我发现有关将grep用于特殊字符的原始线程

–THESorcerer
15-10-25在9:36

我最近遇到了一个Android系统,其中egrep和grep -E由不同的可执行文件BusyBox和BSD grep处理。对于非Posix regex构造,这两个变体在行为上有所不同,例如\ s。这引起了很多混乱...

– Lii
19-09-4在11:42



#2 楼

来自man grep

 egrep is the same as grep -E.
 fgrep is the same as grep -F.  Direct invocation as either egrep  or  
  fgrep  is  deprecated,  but  is provided to allow historical applications
  that rely on them to run unmodified.


如果不想将grepped的字符串解释为模式,则可以使用fgrepgrep -F

如果需要使用扩展的正则表达式,请使用egrepgrep -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.)
 


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

评论


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

–同构
14年8月26日在21:05

@isomorphismes:此Wikibooks链接很好地说明了这一点...

–zb226
16-2-18在9:38



#4 楼

在“ man grep”中:


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


评论


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

–同构
14年8月26日在21:05

#5 楼

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

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

Btw。我真的鼓励您尝试一下-它支持PREG,并且具有更多有用的默认值(例如,着色,跳过.svn之类的可能不是您想要的目录,遵循符号链接的能力,并且键入起来稍微容易一些ack比grep -E)。