grep
,egrep
和fgrep
之间的技术差异并提供合适的示例吗?#1 楼
egrep
与grep -E
是100%等效fgrep
与grep -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的字符串解释为模式,则可以使用
fgrep
或grep -F
。 如果需要使用扩展的正则表达式,请使用
egrep
或grep -E
。#3 楼
egrep
和fgrep
基本分别等效于grep -E
和grep -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)。
评论
超级用户很好地说明了grep,egrep,fgrep和pgrep之间的区别:superuser.com/questions/508881/…