68

我有一个关于grepegrepin的问题unix

由于我最近在学习shell commandsin unix,我想知道 grep 和 egrep 之间有什么区别。

我发现我们可以将 grep 和 egrep 与正则表达式一起使用。但是,我发现这两个命令之间有些不同:

For ^, grep 和 egrep 具有相同的含义,即在开头查找包含给定内容的行。

但是,对于|, grep,前面没有反斜杠|,表示 的字符|,如果我在它前面放一个反斜杠,它会打开它 查找行包含它前面和后面的东西的特殊含义. 但是,对于 egrep 来说,情况恰恰相反。|具有grep的后者含义,\|使用时具有grep的前者含义。

其他人可以解释为什么吗?

4

4 回答 4

105

egrep命令是grep二进制文件的快捷方式,但有一个例外:当grep调用 as时egrepgrep二进制文件会激活其内部逻辑以运行,就好像它被调用 as 一样grep -E

不同之处在于该-E选项允许使用扩展的正则表达式模式。这允许使用元符号,例如+,?|. 这些不是我们可能在单词或文件名中使用的普通字符,而是grep二进制文件本身的控制命令。因此,对于egrep,该字符|表示逻辑或。

因此,例如,您想要列出目录中的文件,并且只查看那些包含“mp4”或“avi”作为文件扩展名的文件。和egrep你一起做:

ls | egrep "mp4|avi"

在此示例|中,其作用类似于 OR 命令。它将从ls所有包含“mp4”或“avi”字符串的名称中获取输出。如果您使用简单的grep命令运行它,您将一无所获,因为grep不知道|命令之类的东西。相反,grep将搜索“mp4|avi”作为整个文本字符串(带有管道符号)。例如,如果你有一个|mp4|avi|cool-guy.q2.stats在你的目录中命名的文件,你将通过简单grep的管道搜索得到它。

因此,这就是为什么您应该在命令中转义|egrep达到与grep. 转义将屏蔽|命令对grep二进制的特殊含义。

于 2013-08-06T09:55:50.193 回答
9

摘自grep 解释man页面。

grep提供匹配器选择选项。
-E将模式解释为扩展正则表达式 (ERE)
-G将模式解释为基本正则表达式 (BRE)。这是未指定选项时的默认值。

变体程序egrepgrep -E. 不推荐使用该变体,但提供该变体是为了向后兼容。

因此,
grep蕴含grep -G
egrep意味着grep -E

正则表达式模式中的语法有两种解释。区别在于一些特殊字符的行为,?, +, (), {}, 和|

  • BRE(基本正则表达式)——这些字符没有特殊含义,除非以反斜杠为前缀\
  • ERE(扩展正则表达式)——这些字符特殊的,除非以反斜杠为前缀\

由于(BRE) 和(ERE)^具有相同的解释,因此两者的工作方式相同。 但是,是(BRE) 和(ERE) 以不同方式解释的字符之一,因此需要根据正则表达式的意图使用 a 对其进行转义。grepegrep
|grepegrep\

于 2020-05-05T17:41:44.387 回答
2

grep 和 egrep 的区别是:

grep

  • 它使用基本正则表达式,这意味着如果你使用grep 'a|b'它就不会使用这个“|” 作为 OR 运算符,不使用此“\”前缀。
  • 它在每个 FILE 中搜索 PATTERN。

鹭鸶

  • 它使用扩展正则表达式,在此您可以使用这样的命令egrep 'a|b'
  • 它按原样处理元字符,而不是像 grep 那样将它们替换为字符串。
于 2021-01-06T12:49:08.523 回答
0

grep 命令用于在文件中查找需要 patran 的行,我们通过放置 '\' 来分隔元字符

egrep 等于 grep -E,扩展正则表达式使用 {,},(,),|,? 作为元字符而不在表达式中给出'\'

fgrep 用于查找固定字符串,等于 grep -F

test.txt
文件
平铺
(f|t)ile
(\f\|\t)ile

grep "(f|t)ile" test.txt
(f|t)ile

grep "(\f\|\t)ile" test.txt
文件
平铺

egrep "(f|t)ile" test.txt
文件
平铺

egrep "(\f\|\t)ile" test.txt
(f|t)ile

fgrep "(f|t)ile" test.txt
(f|t)ile

fgrep "(\f\|\t)ile" test.txt
(\f\|\t)ile

于 2017-12-19T17:23:10.717 回答