Answers:
从历史上看,这些开关是在单独的二进制文件中提供的。在某些非常老的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
egrep
或fgrep
; -E
并且-F
是标准的。实际上存在一些小的不兼容之处egrep
:对待方式{
略有不同。
fgrep
使用Aho-Corasick后端,而grep
使用Commentz-Walter的修改版。这意味着grep
O(mn)复杂度fgrep
最差,而O(m + n)最差。
egrep
,并grep -E
通过不同的可执行文件,BusyBox的和BSD grep的进行处理。对于非Posix regex构造,这两个变体的行为有所不同,例如\s
。这导致了很多混乱……
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.)
错误消息可能有所不同。
来自“ man grep”:
提供了三个变体程序,例如:rep,fgrep和rgrep。egrep与grep -E相同。fgrep与grep -F相同。rgrep与grep -r相同。不建议使用egrep或fgrep的直接调用,但提供了直接调用,以允许依赖它们的历史应用程序不经修改地运行。
如果您搜索逐字字符串,并希望确保对传递的字符串进行逐字解释(即,无需冒点或问号会被解释为其他含义的风险),请使用fgrep或egrep -F。
至于egrep和grep之间的区别,我认为egrep通常是您想要的东西。 GNU手册站点列出了grep和egrep之间的区别,这似乎在于语法:有些东西需要斜杠,而另一些不需要斜杠。我认为egrep与perl regexp和javascript regexp更“兼容”,因此对我来说使用egrep更容易。
顺便说一句。我真的鼓励你给ACK一个尝试-它支持半固化片,并有更多的有用的默认值(即着色,跳过可能-不什么,你想目录,如.svn文件,要遵循符号链接的能力,这是一个有点容易输入ack比grep -E)。