Vis*_*lvi 294 grep regular-expression
谁能告诉我grep
, egrep
, 和之间的技术差异fgrep
并提供合适的示例?
我什么时候需要使用grep
over egrep
,反之亦然?
Cal*_*leb 317
从历史上看,这些开关是在单独的二进制文件中提供的。在一些非常老的 Unix 系统上,你会发现你需要调用单独的二进制文件,但在所有现代系统上,开关是首选。grep 的手册页有关于这方面的详细信息。
至于他们做什么,-E
将 grep 切换到特殊模式,以便将表达式评估为 ERE(扩展正则表达式)而不是其正常模式匹配。此语法的详细信息在手册页上。
-E, --extended-regexp
将 PATTERN 解释为扩展的正则表达式
该-F
开关切换的grep进入它接受匹配模式,但随后拆分该图案成每行一个搜索字符串并执行一个或任何字符串的搜索而不做任何特殊模式匹配不同的模式。
-F, --fixed-strings
将 PATTERN 解释为由换行符分隔的固定字符串列表,其中任何一个都将被匹配。
以下是一些示例场景:
您有一个文件,其中包含一个纯文本格式的 10 个 Unix 用户名列表。您想在您的机器上搜索组文件以查看列出的十个用户中的任何一个是否属于任何特殊组:
grep -F -f user_list.txt /etc/group
Run Code Online (Sandbox Code Playgroud)
-F
开关在这里有帮助的原因是模式文件中的用户名被解释为纯文本字符串。例如,点将被解释为点而不是通配符。
您想使用花哨的表达式进行搜索。例如,括号()
可用于指示|
用作 OR 运算符的组。您可以使用-E
以下命令运行此搜索:
grep -E '^no(fork|group)' /etc/group
Run Code Online (Sandbox Code Playgroud)
...返回以“nofork”或“nogroup”开头的行。如果没有-E
开关,您将不得不转义所涉及的特殊字符,因为使用正常模式匹配,他们只会搜索该确切模式;
grep '^no\(fork\|group\)' /etc/group
Run Code Online (Sandbox Code Playgroud)roz*_*acz 33
来自man grep
:
egrep 与 grep -E 相同。 fgrep 与 grep -F 相同。直接调用 egrep 或 fgrep 已弃用,但提供以允许历史应用程序 依赖它们未经修改地运行。
您使用fgrep
orgrep -F
如果您不希望将 grepped 字符串解释为模式。
您使用egrep
或者grep -E
如果您需要使用扩展的正则表达式。
Sté*_*nez 16
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.)
Run Code Online (Sandbox Code Playgroud)
不过,错误消息可能会有所不同。
来自“男人 grep”:
可以使用三个变体程序 egrep、fgrep 和 rgrep。egrep 与 grep -E 相同。fgrep 与 grep -F 相同。rgrep 与 grep -r 相同。不推荐使用 egrep 或 fgrep 的直接调用,但提供它是为了允许依赖它们的历史应用程序不加修改地运行。