正则表达式之grep、egrep工具的使用方法
什么是正则表达式?
正则表达式又称正规表达式、常规表达式。在代码中常简写为 regex、regexp 或 RE。正则表达式是使用单个字符串来描述、匹配一系列符合某个句法规则的字符串,简单来说, 是一种匹配字符串的方法,通过一些特殊符号,实现快速查找、删除、替换某个特定字符串。
正则表达式是由普通字符与元字符组成的文字模式。模式用于描述在搜索文本时要匹配的一个或多个字符串。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。其中普通字符包括大小写字母、数字、标点符号及一些其他符号,元字符则是指那些在正则表达式中具有特殊意义的专用字符,可以用来规定其前导字符(即位于元字符前面的字符)在目标对象中的出现模式。
正则表达式一般用于脚本编程与文本编辑器中。很多文本处理器与程序设计语言均支持正则表达式,如前面提到的 Perl、Linux 系统中常见的文本处理器(grep、egrep、sed、awk)。正则表达式具备很强大的文本匹配功能,能够在文本海洋中快速高效地处理文本。
基础正则表达式:
正则表达式的字符串表达方法根据不同的严谨程度与功能分为基本正则表达式与扩展正则表达式。基础正则表达式是常用的正则表达式的最基础的部分。在 Linux 系统中常见的文件处理工具中 grep 与 sed 支持基础正则表达式,而 egrep 与 awk 支持扩展正则表达式。掌握基础正则表达式的使用方法,首先必须了解基本正则表达式所包含的元字符的含义,下面我们复制一份http服务的配置文件来进行演示。
[root@localhost ~]# cp /etc/httpd/conf/httpd.conf /opt/httpd.txt
[root@localhost ~]# cat /opt/httpd.txt
#
# This is the main Apache HTTP server configuration file. It contains the
# configuration directives that give the server its instructions.
# See <URL:http://httpd.apache.org/docs/2.4/> for detailed information.
# In particular, see
# <URL:http://httpd.apache.org/docs/2.4/mod/directives.html>
# for a discussion of each configuration directive................................... //省略部分内容
grep命令
(1)查找特定字符
查找特定字符非常简单,如执行以下命令即可从 httpd.txt 文件中查找出特定字符“do” 所在位置。其中“-n”表示显示行号、“-i”表示不区分大小写。命令执行后,符合匹配标准的字符,字体颜色会变为红色。
若反向选择,如查找不包含“do”字符的行,则需要通过 grep 命令的“-vn”选项实现。
[root@localhost opt]# grep -vn 'do' httpd.txt
1:#
2:# This is the main Apache HTTP server configuration file. It contains the
3:# configuration directives that give the server its instructions.
5:# In particular, see
7:# for a discussion of each configuration directive.
8:# 。........................... //省略部分内容
(2)利用中括号“[]”来查找集合字符
想要查找“shirt”与“short”这两个字符串时,可以发现这两个字符串均包含“sh” 与“rt”。此时执行以下命令即可同时查找到“shirt”与“short”这两个字符串。“[]”中无论有几个字符,都仅代表一个字符,也就是说“[io]”表示匹配“i”或者“o”。
[root@localhost opt]# tail -3 httpd.txt
short
shirt
shart
[root@localhost opt]# grep -n 'sh[io]rt' httpd.txt
354:short
355:shirt
[root@localhost opt]#
若要查找包含重复单个字符“oo”时,只需要执行以下命令即可。
[root@localhost opt]# head -5 httpd.txt
wood
woood
wooood
woooood
#
[root@localhost opt]# grep -n 'oo' httpd.txt
1:wood
2:woood
3:wooood
4:woooood
若查找“oo”前面不是“w”的字符串,只需要通过集合字符的反向选择“[^]”来实现该目的,如执行“grep –n’[^w]oo’httpd.txt”命令表示在 httpd.txt 文本中查找“oo” 前面不是“w”的字符串。执行结果看到“woood”还是查找到了,因为“oo”前面是“o”也不是“w”,符合条件,其它同理。
若不希望“oo”前面存在小写字母,可以使用“grep –n’[^a-z]oo’httpd.txt”命令实现,其中“a-z”表示小写字母,大写字母则通过“A-Z”表示。
查找包含数字的行可以通过“grep –n’[0-9]’ httpd.txt”命令来实现。
(3)查找行首“^”与行尾字符“$”
基础正则表达式包含两个定位元字符:“”(行首)与“$”(行尾)。在上面的示例中,查询“the”字符串时出现了很多包含“the”的行,如果想要查询以“the”字符串为行首的行,则可以通过“”元字符来实现。
查询以小写字母开头的行可以通过“[a-z]”规则来过滤,查询大写字母开头的行则使用“[A-Z]”规则,若查询不以字母开头的行则使用“[a-zA-Z]”规则。
[root@localhost opt]# grep -n '^[a-z]' httpd.txt
1:wood
2:woood
3:wooood
4:woooood
358:short
359:shirt
360:shart
[root@localhost opt]# grep -n '^[A-Z]' httpd.txt
35:ServerRoot "/etc/httpd"
46:Listen 80
60:Include conf.modules.d/*.conf
70:User apache
71:Group apache
“^”符号在元字符集合“[]”符号内外的作用是不一样的,在“[]”符号内表示反向选择,在“[]”符号外则代表定位行首。反之,若想查找以某一特定字符结尾的行则可以使用“$”定位符。例如,执行以下命令即可实现查询以小数点(.)结尾的行。因为小数点(.) 在正则表达式中也是一个元字符(后面会讲到),所以在这里需要用转义字符“\”将具有特 殊意义的字符转化成普通字符。
当查询空白行时,执行“grep –n’^$'httpd.txt”命令即可。
(4)查找任意一个字符“.”与重复字符“ * ”
前面提到,在正则表达式中小数点(.)也是一个元字符,代表任意一个字符。例如, 执行以下命令就可以查找“w??d”的字符串,即共有四个字符,以 w 开头 d 结尾。
在上述结果中,“wood”字符串“w…d”匹配规则。若想要查询 oo、ooo、ooooo 等资料,则需要使用星号(*)元字符。但需要注意的是,“*”代表的是重复零个或多个前面的单字符。“o*”表示拥有零个(即为空字符)或大于等于一个“o”的字符,因为允许空字符,所以执行“grep –n‘o*’httpd.txt”命令会将文本中所有的内容都输出打印。如果是“oo*”, 则第一个 o 必须存在,第二个 o 则是零个或多个 o,所以凡是包含 o、oo、ooo、ooo,等的资料都符合标准。同理,若查询包含至少两个 o 以上的字符串,则执行“grep –n’ooo*’ httpd.txt”命令即可。
查询以 w 开头 d 结尾,中间包含至少一个 o 的字符串,执行以下命令即可实现。
查询以 w 开头 d 结尾,中间的字符可有可无的字符串。
查询任意数字所在行。
(5)查找连续字符范围“{}”
在上面的示例中,我们使用“.”与“*”来设定零个到无限多个重复的字符,如果想要限制一个范围内的重复的字符串该如何实现呢?例如,查找三到五个 o 的连续字符,这个时候就需要使用基础正则表达式中的限定范围的字符“{}”。因为“{}”在 Shell 中具有特殊 意义,所以在使用“{}”字符时,需要利用转义字符“\”,将“{}”字符转换成普通字符。 “{}”字符的使用方法如下所示。
- 查询两个 o 的字符。
- 查询以 w 开头以 d 结尾,中间包含 2~5 个 o 的字符串。
- 查询以 w 开头以 d 结尾,中间包含 2 以上 o 的字符串。
(6)元字符总结
通过上面几个简单的示例,我们可以了解到常见的基础正则表达式的元字符主要包括以下几个:
元字符 | 作用 |
---|---|
^ | 匹配输入字符串的开始位置。除非在方括号表达式中使用,表示不包含该字符集合。要匹配“^”字符本身,请使用“^” |
$ | 匹配输入字符串的结尾位置。如果设置了 RegExp 对象的 Multiline 属性,则“KaTeX parse error: Undefined control sequence: \n at position 6: ”也匹配‘\̲n̲’或‘\r’。要匹配“”字符本身,请使用“$” |
. | 匹配除“\r\n”之外的任何单个字符 |
\ | 将下一个字符标记为特殊字符、原义字符、向后引用、八进制转义符。例如,‘n’匹配字符“n”。 ‘\n’匹配换行符。序列‘\’匹配“\”,而‘(’则匹配“(” |
* | 匹配前面的子表达式零次或多次。要匹配“*”字符,请使用“*” |
[] | 字符集合。匹配所包含的任意一个字符。例如,“[abc]”可以匹配“plain”中的“a” |
[^] | 赋值字符集合。匹配未包含的一个任意字符。例如,“[^abc]”可以匹配“plain”中“plin”中的任何一个字母 |
[n1-n2] | 字符范围。匹配指定范围内的任意一个字符。例如,“[a-z]”可以匹配“a”到“z”范围内的任意一个小写字母字符。注意:只有连字符(-)在字符组内部,并且出现在两个字符之间时,才能表示字符的范围;如果出现在字符组的开头,则只能表示连字符本身 |
{n} | n 是一个非负整数,匹配确定的 n 次。例如,“o{2}”不能匹配“Bob”中的“o”,但是能匹配“food”中的两个 o |
{n,} | n 是一个非负整数,至少匹配 n 次。例如,“o{2,}”不能匹配“Bob”中的“o”,但能匹配“foooood”中的所有 o。“o{1,}”等价于“o+”。“o{0,}”则等价于“o*” |
{n,m} | m 和n 均为非负整数,其中 n<=m,最少匹配 n 次且最多匹配 m 次 |
grep 命令仅支持基础正则表达式,如果使用扩展正则表达式,需要使用 egrep 或 awk 命令。awk 命令在后面的博客进行讲解,这里我们直接使用 egrep 命令。egrep 命令与 grep 命令的用法基本相似。egrep 命令是一个搜索文件获得模式,使用该命令可以搜索文件中的任意字符串和符号,也可以搜索一个或多个文件的字符串,一个提示符可以是单个字符、一个字符串、一个字或一个句子。与基础正则表达式类型相同,扩展正则表达式也包含多个元字符,常见的扩展正则表达式的元字符主要包括以下几个:
下面分别演示每个例子
示例1:执行“egrep -n ‘wo+d’ httpd.txt”命令,即可查询"wood" “woood” "woooooood"等字符串
示例2:执行“egrep -n ‘bes?t’ httpd.txt”命令,即可查询“bet”“best”这两个字符串
示例3:执行“egrep -n ‘of|is|on’ httpd.txt”命令即可查询"of"或者"if"或者"on"字符串
示例4:“egrep -n ‘t(a|e)st’ test.txt”。“tast”与“test”因为这两个单词的“t”与“st”是重复的,所以将“a”与“e”列于“()”符号当中,并以“|”分隔,即可查询"tast"或者"test"字符串
示例5:“egrep -n ‘A(xyz)+C’ test.txt”。该命令是查询开头的"A"结尾是"C",中间有一个以上的 "xyz"字符串的意思
正则表达式之grep、egrep工具的使用方法相关推荐
- 正则表达式(grep命令,egrep命令,sed命令,awk命令,sort工具,uniq工具)
文章目录 正则表达式 基础正则表达式:grep命令 查找行首"^"与行尾字符"$ 查找连续字符范围{} 元字符总结 正则表达式总结 扩展正则表达式 egrep命令 sed ...
- grep 判断不是正则的_Shell—正则表达式(grep命令、sed工具)
前言 正则表达式对于系统管理员来说是非常重要的,熟练运用正则表达式可使工作变得更加简单.方便. 一.正则表达式概述 正则表达式定义 正则表达式,又称正规表达式.常规表达式 使用字符串来描述.匹配一系列 ...
- shell脚本——grep cut sort uniq tee diff paster tr等小工具的使用方法
shell脚本的一些小工具的使用方法 grep 语法和选项 实例 cut 语法和选项 实例 sort 语法和选项 实例 uniq 语法和选项 实例 tee 语法和选项 实例 diff 语法和选项 实例 ...
- 正则表达式grep, egrep, fgrep
grep,egrep,fgrep : print lines matching a pattern 1.grep : grep [options] PATTERN FILE... PATTERN由元字 ...
- grep/egrep和正则表达式汇总
grep, egrep, fgrep 语法格式: grep [option] ... 'PATTERN' FILE --color=auto 对目标FILE进行搜索,显示能够匹配的行 正则表达式 基本 ...
- 正则表达式和文本处理工具
一 什么是正则 正则就是用一些具有特殊含义的符号组合到一起(称为正则表达式)来描述字符或者字符串的方法.或者说:正则就是用来描述一类事物的规则. 生活中处处都是正则: 比如我们描述:4条腿 ...
- shell--基础正则表达式之grep
一.基础正则表达式的概述 正则表达式又称正规表达式.常规表达式.在代码中常简写为 regex.regexp 或 RE.正则表达式是使用单个字符串来描述.匹配一系列符合某个句法规则的字符串,简单来说, ...
- grep,egrep及元字符和posix字符集
grep命令详解 grep命令是*nix上匹配行的一个工具,可以用来搜索匹配的行,对于查找指定字符和字符行非常好用,grep非常有效grep家族包含grep,egrep,fgrep, grep使用的是 ...
- grep, egrep
linux下的find和grep能够显著提高工作效率,但是这两个工具我还没有学得透彻,所以慢慢摸索,例如你想在一个工程的源码中找到gxmsg.h文件那么如果你熟悉这两个命令很快就可以找到 1.find ...
最新文章
- 【Android 插件化】多开原理 | 使用插件化技术的恶意应用 | 插件化的其它风险 | 应用开发推荐方案
- 【292天】跃迁之路——程序员高效学习方法论探索系列(实验阶段50-2017.11.24)...
- mac下intellij idea 永久破解
- 今晚7点,腾讯专家详解腾讯广告召回系统的演进
- 趣学 C 语言(二)—— typedef 与 #define
- linux命令行彩蛋,技术|11个无用而有趣的Linux终端彩蛋
- Python基础-Python中列表的使用
- 示波器电流探头可分为无源和有源两类,它们的区别是什么?
- Windows10使用命令行打开3389_内网渗透(实验)之域渗透深入弹shell开3389拿域控
- 刷题总结——玉蟾宫(bzoj3039单调栈)
- 天天都在和游戏打交道,你知道到底什么是游戏UI吗?优漫动游
- MIGO结合NFT技术带来全新DeFi金融平台
- 39、Docker(镜像命令)
- Mac 怎么修改开机背景详解!
- kettle导数据入HBase数据库报错解决
- 硬核拆解自动驾驶工具链丨如何应对无人车部署落地的挑战?
- 传奇列表获取失败与登录器太老怎么解决
- mysql sga_MySQL王者晋级之路(一)安装、体系结构和存储引擎
- Office Professional Plus 2016简体中文版
- ADS2019学习笔记:三、SPICE model导入
热门文章
- 郑州师范学院计算机科学与技术代码,郑州师范学院—VR虚拟仿真实验中心
- 利用闲置的树莓派4B搭建一个NAS(一)
- Qt框架类图大全,类继承关系一图搞定
- maven 排除pom依赖_Maven dependency插件 排除依赖
- html css插图片不显示,新手问个比较弱智的问题我用img标签插入图片显示不出来时怎么回事?_html/css_WEB-ITnose...
- java模板引擎 jade_Jade 模板引擎使用
- 新能源汽车BMS开发工程师
- 关于PCA主成分分析与KL变换
- 实时时钟芯片DS3231应用笔记,使用指南,FAQ全集
- hive的 LAG,LEAD,FIRST_VALUE,LAST_VALUE函数