网站搜索

Linux 中的 Grep、Egrep 和 Fgrep 有什么区别?


grep 实用程序是类 Unix 系统上著名的搜索工具之一,可用于搜索任何内容,无论是文件、文件中的一行或多行。它的功能非常广泛,这可以归因于它支持的大量选项,例如:使用字符串模式、reg-ex 模式或基于 perl 的 reg-ex 等进行搜索。

由于其功能不同,它有许多变体,包括 grepegrep扩展 GREP)、fgrepfgrep) >固定 GREP)、pgrep处理 GREP)、rgrep递归 GREP)等。但这些变体与原始的 grep 有细微的差别,这使得它们很受欢迎,并被各种 Linux 程序员用于特定的任务。

仍有待研究的主要问题是三个主要变体,即 'grep''egrep''fgrep' 之间有什么区别grep 使 Linux 用户根据需要选择一个或另一个版本。

grep 的一些特殊元字符

  1. + – 相当于前一个字符出现一次或多次。
  2. ? – 这表示前一个字符几乎重复 1 次。例如:a? 将匹配 'a''aa'
  3. ( – 交替表达式的开始。
  4. ) – 交替表达式结束。
  5. | – 匹配由 '|' 分隔的任一表达式。例如:“(a|b)cde ” 将匹配 'abcde''bbcde'
  6. { – 此元字符表示范围说明符的开始。例如:“a{2} ” 匹配文件中的“aa ”,即 a 2 次。
  7. } – 此元字符表示范围说明符的结尾。

grep、egrep 和 fgrep 之间的区别

grepegrepfgrep 之间的一些主要区别可以强调如下。对于这组示例,我们假设正在执行操作的文件是:

查询命令

grep全局正则表达式打印 是类 Unix 系统上的主要搜索程序,它可以搜索任何文件或文件列表中的任何类型的字符串,甚至可以搜索任何文件的输出。命令。

建议阅读: Linux grep 命令的 12 个实用示例

除了普通字符串之外,它还使用基本正则表达式作为搜索模式。在基本正则表达式 (BRE) 中,元字符如:'{','}','(',')','|','+','?' 失去了意义,被视为字符串的普通字符,如果要被视为特殊字符,则需要转义。

建议阅读: 11 关于字符类和括号表达式的高级“Grep”命令

此外,grep 使用 Boyer-Moore 算法来快速搜索任何字符串或正则表达式。

grep -C 0 '(f|g)ile' check_file
grep -C 0 '\(f\|g\)ile' check_file

就像这里一样,当命令在不转义 '(' ')''|' 的情况下运行时,它会搜索完整的字符串,即 “(f|g )ile ” 在文件中。但是,当特殊字符被转义时,grep 不会将它们视为字符串的一部分,而是将它们视为元字符并搜索单词 “file ”“gile ”在文件中。

Egrep 命令

Egrepgrep -E 是 grep 或扩展 grep 的另一个版本。这个版本的 grep 在搜索正则表达式模式时高效且快速,因为它按原样对待元字符,并且不会像 grep 那样将它们替换为字符串,因此您无需将它们转义为字符串在 grep 中。它使用 ERE 或扩展正则表达式集。

对于egrep,即使您不转义元字符,它也会将它们视为特殊字符并用它们替换它们的特殊含义,而不是将它们视为字符串的一部分。

egrep -C 0 '(f|g)ile' check_file
egrep -C 0 '\(f\|g\)ile' check_file

就像这里一样,当元字符没有按照这些字符的含义进行转义时,egrep 会搜索 “file ” 字符串。但是,当这些字符被转义时,egrep 将它们视为字符串的一部分,并在文件中搜索完整的字符串 “(f|g)ile ”

fgrep 命令

FgrepFixed grepgrep -F 是 grep 的另一个版本,在搜索整个字符串时搜索速度很快而不是正则表达式,因为它不识别正则表达式,也不识别任何元字符。为了搜索任何直接字符串,应该选择这个 grep 版本。

Fgrep 搜索完整的字符串,甚至不识别特殊字符作为正则表达式的一部分,无论是否转义。

fgrep -C 0 '(f|g)ile' check_file
fgrep -C 0 '\(f\|g\)ile' check_file

就像,当元字符没有转义时,fgrep 在文件中搜索完整的字符串 “(f|g)ile ”,当元字符被转义时,fgrep 命令搜索“\(f\|g\)ile ” 文件中的所有字符。

我们已经介绍了 grep 命令的一些实际示例,如果您想更多地了解 Linux 中的 grep 命令,您可以在这里阅读它们。

学习 Linux grep 命令的 12 个实用示例

结论

上面突出显示了 'grep''egrep''fgrep' 之间的区别。除了使用的正则表达式集和执行速度不同之外,所有三个版本的 grep 的其余命令行参数保持相同,甚至代替“egrep”或“fgrep”、“grep -E”或“grep -建议使用F”。

如果您发现这三个版本的 grep 之间有任何其他差异,请在评论中提及。