egrep和grep之间的区别

时间:2013-08-05 13:03:21

标签: regex grep

我对grep中的egrepunix提出了疑问。

由于我最近正在研究shell commands中的unix,我想知道grep和egrep之间有什么区别。

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

对于^,grep和egrep具有相同的含义,即在一开始就找到包含给定内容的行。

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

其他人可以解释一下原因吗?

4 个答案:

答案 0 :(得分:67)

是的,我可以。

egrep命令是grep二进制文件的快捷方式,但有一个例外,当grep被调用为egrep时,grep二进制文件会激活其内部逻辑因为它被称为grep -E

不同之处在于-E选项允许使用扩展的正则表达式模式。它允许您使用+?|等元符号。它们不是我们以前在单词或文件名中使用的序数字符,而是grep二进制本身的控制命令。因此,|表示逻辑OR。

因此,例如,您希望列出目录中的文件,并仅查看包含“mp4”或“avi”扩展名的文件。使用egrep,您将执行以下操作:

ls | egrep "mp4|avi"

在此示例中,|的行为类似于OR命令,它将从ls中获取包含“mp4”或“avi”字符串的所有名称的输出。如果使用普通grep命令运行它,你将什么也得不到,因为grep不知道|命令这样的东西,它将搜索“mp4 | avi”全文字符串(使用 pipe 符号)。例如。如果你的目录中有|MPG|cool-guy.q2.stats个文件,你可以通过普通grep搜索管道获得它。

因此,这就是为什么你应该在|命令中转义egrep以达到与grep相同的效果。转义将屏蔽|二进制grep命令的特殊含义。

答案 1 :(得分:1)

grep explained和手册页中提取。

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

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

  • BRE(基本正则表达式)–这些字符不会具有特殊含义除非以反斜杠\为前缀。
  • ERE(扩展正则表达式)–这些字符 是特殊字符,除非带有反斜杠\

grep提供了匹配器选择选项。

-E将模式解释为扩展的正则表达式(ERE)

-G将模式解释为基本正则表达式(BRE)。 这是默认设置

答案 2 :(得分:1)

grep 和 egrep 的区别在于:

grep

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

egrep

  • 它使用扩展正则表达式,在此您可以使用这样的命令 egrep 'a|b'
  • 它按原样处理元字符,不会像 grep 那样将它们替换为字符串。

答案 3 :(得分:0)

grep命令用于查找文件中需要patran的行,我们通过放置'\'

来分隔元字符

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

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

test.txt
文件
瓷砖
(F | T)ILE
页(\ f \ | \ t)的异亮氨酸

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)的异亮氨酸