grep
谁能告诉我、egrep
、 和之间的技术差异fgrep
并提供合适的例子吗?
我什么时候需要使用grep
over egrep
,反之亦然?
答案1
从历史上看,这些开关是在单独的二进制文件中提供的。在一些非常古老的 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
答案2
从man grep
:
egrep 与 grep -E 相同。 fgrep 与 grep -F 相同。直接调用为egrep或 fgrep 已弃用,但提供它是为了允许历史应用程序 依赖它们未经修改地运行。
你使用fgrep
或者grep -F
如果你不希望 grep 字符串被解释为模式。
如果需要使用扩展正则表达式,则可以使用egrep
or 。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.)
但错误消息可能有所不同。
答案4
如果您搜索逐字字符串,并且希望确保您传递的字符串被逐字解释(即不冒点或问号被解释为其他内容的风险),请使用 fgrep 或 egrep -F。
至于 egrep 和 grep 之间的区别,我认为 egrep 大多数时候就是您想要的东西。 GNU 手册站点列出了 grep 和 egrep 之间的差异,这些差异似乎在于语法:有些东西需要斜杠,而另一些则不需要。我认为egrep与perl正则表达式和javascript正则表达式更“兼容”,因此我更容易使用egrep。
顺便提一句。我真的鼓励你给予确认尝试一下 - 它支持 PREG,并且具有更有用的默认设置(即着色、跳过可能不是您想要的目录(如 .svn)、跟踪符号链接的能力,以及输入 ack 比 grep -E 更容易一些)。