暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

一文掌握egrep、fgrep与rgrep的奥秘

watson 2024-06-18
139

在Linux世界中,grep是一个强大的文本搜索工具,它允许用户通过正则表达式来搜索文本,并将匹配的行打印出来。而egrep、fgrep和rgrep则是grep的扩展,是在特定场景下更精准高效的搜索神器。本文将带你深入了解它们之间的区别与联系,让你轻松掌握这些强大的文本搜索工具。


grep:基础且强大的文本搜索工具

grep是最基础的文本搜索工具,它使用模式匹配(包括正则表达式)来搜索文本。grep命令提供丰富的选项,能满足多种需求,允许你在文件中搜索指定的字符串或模式,并将匹配的内容输出到终端。

示例:在文件example.txt中搜索包含“error”的行

grep "error" example.txt


egrep:支持扩展正则表达式的grep

egrep表示extended-regexp grep,它支持扩展正则表达式,特别适用于处理复杂的搜索模式。扩展正则表达式提供了更多的元字符和更灵活的匹配方式,使得搜索过程更加高效和方便。

示例:在文件example.txt中搜索电子邮件地址

egrep "^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$" example.txt

解释:

^ 表示字符串的开始。

[a-zA-Z0-9._-]+ 匹配一个或多个(由+指定)在方括号内的字符。这些字符可以是小写字母(a-z)、大写字母(A-Z)、数字(0-9)、点(.)、下划线(_)或减号(-)。

@ 匹配@符号。

[a-zA-Z0-9.-]+ 匹配一个或多个在括号内的字符。这些字符可以是小写字母(a-z)、大写字母(A-Z)、数字(0-9)、点(.)或减号(-)。

\. 匹配点。因为点在正则表达式中有特殊含义,所以需要用反斜杠进行转义。

[a-zA-Z]{2,} 匹配两个或更多的字母。

$ 表示字符串的结束。


fgrep:快速搜索固定字符串的grep

fgrep表示fixed-strings grep,它将模式解释为固定字符串,而不是正则表达式。这意味着fgrep不会解析元字符,从而提高了搜索速度。当你知道要搜索的确切内容,并且不需要使用正则表达式时,fgrep是一个很好的选择。

示例:在文件example.txt中搜索固定字符串“[2024]”

fgrep "[2024]" example.txt

字符串中的左中括号([)和右中括号(])会被当成普通字符。如果使用grep命令,"[2024]" 会被当成正则表达式,将搜索包含0、2、4任意一个字符的字符串。


rgrep:递归搜索文件的grep

rgrep表示recursive grep,它支持递归搜索。这意味着rgrep会在指定目录及其子目录中的所有文件中搜索指定的字符串或模式。

示例:在当前目录及其子目录中搜索包含“2024”的行

rgrep "2024" .


实际上,这三个命令均是grep的封装版本。首先,通过 which egrep 命令找到它的“老家”,通常位于/usr/bin目录下。然后执行 ls -l  /usr/bin/[efr]grep 后,你会发现它们的文件大小都非常小,不到30字节。最后,查看这些文件的内容,发现它们是调用grep并加上默认的选项。

例如egrep的内容:

#!/bin/shexec grep -E "$@"

-E 表示将模式解释为扩展正则表达式,"$@" 表示命令行传递的所有参数。

相应的,fgrep命令使用 -F 选项,将模式解释为固定字符串,而不是正则表达式;rgrep命令使用 -r 选项,使用递归搜索。


再介绍一个非常实用的选项:-f FILE 或者 --file=FILE。它表示从文件FILE中获取模式,每个模式占用一行。这使得grep命令及其扩展在处理复杂的搜索任务时更加灵活和高效。

示例:在文件example.txt中搜索电子邮件地址、网址、手机号码

可以这样编写模式文件FILE:

[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}https?:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*\/?1[3-9]\d{9}

然后这样使用该模式文件:

egrep -of FILE example.txt

-o 选项表示仅输出匹配模式的内容,而不是整行。为了让命令更加简洁,我们可以将不带参数的多个选项合并写在一起,而将需要指定参数的选项放在最后。

上述示例还可以写成这样:

grep -Eof FILE example.txt


总结

grep、egrep、fgrep和rgrep是文本搜索中常用的工具,它们各自具有不同的特点和功能。通过了解它们之间的区别与联系,你可以根据具体需求选择合适的命令,从而更高效地进行文本搜索和处理。希望本文能帮助你更好地掌握这些强大的文本搜索工具!

Shell97

Shell · 目录




上一篇Shell脚本执行时间记录,三种方法轻松搞定!下一篇揭秘expr命令:轻松实现数值与字符串运算

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论