shell编程之正则表达式(一)基础正则表达式

正则表达式
以前学习了 Shell 脚本的基础用法,已经能够利用条件判断、循环等语句编辑 Shell 脚本。接下来咱们将开始介绍一个很重要的概念——正则表达式(RegularExpression,RE)。
正则表达式的定义
正则表达式又称正规表达式、常规表达式。在代码中常简写为 regex、regexp 或 RE。正则表达式是使用单个字符串来描述、匹配一系列符合某个句法规则的字符串,简单来讲, 是一种匹配字符串的方法,经过一些特殊符号,实现快速查找、删除、替换某个特定字符串。
正则表达式是由普通字符与元字符组成的文字模式。模式用于描述在搜索文本时要匹配的一个或多个字符串。正则表达式做为一个模板,将某个字符模式与所搜索的字符串进行匹配。其中普通字符包括大小写字母、数字、标点符号及一些其余符号,元字符则是指那些在正则表达式中具备特殊意义的专用字符,能够用来规定其前导字符(即位于元字符前面的字符)在目标对象中的出现模式。
正则表达式通常用于脚本编程与文本编辑器中。不少文本处理器与程序设计语言均支持正则表达式,如前面提到的 Perl、Linux 系统中常见的文本处理器(grep、egrep、sed、awk)。正则表达式具有很强大的文本匹配功能,可以在文本海洋中快速高效地处理文本。
正则表达式用途
对于通常计算机用户来讲,因为使用到正则表达式的机会很少,因此没法体会正则表达式的魅力,而对于系统管理员来讲,正则表达式则是必备技能之一。
正则表达式对于系统管理员来讲是很是重要的,系统运行过程当中会产生大量的信息,这些信息有些是很是重要的,有些则仅是告知的信息。身为系统管理员若是直接看这么多的信息数据,没法快速定位到重要的信息,如“用户帐号登陆失败”“服务启动失败”等信息。这时能够经过正则表达式快速提取“有问题”的信息。如此一来,能够将运维工做变得更加简单、方便。
目前不少软件也支持正则表达式,最多见的就是邮件服务器。在 Internet 中,垃圾/广告邮件常常会形成网络塞车,若是在服务器端就将这些问题邮件提早剔除的话,客户端就会减小不少没必要要的带宽消耗。而目前经常使用的邮件服务器 postfix 以及支持邮件服务器的相关分析软件都支持正则表达式的比对功能。未来信的标题和内容与特殊字符串进行对比,发现问题邮件就过滤掉。
除邮件服务器以外,不少服务器软件都支持正则表达式。虽然这些软件都支持正则表达式,不过字符串的对比规则还须要系统管理员来添加,因此做为系统管理员,正则表达式是必须掌握的技能之一。
基础正则表达式
正则表达式的字符串表达方法根据不一样的严谨程度与功能分为基本正则表达式与扩展正则表达式。基础正则表达式是经常使用的正则表达式的最基础的部分。在 Linux 系统中常见的文件处理工具中 grep 与 sed 支持基础正则表达式,而 egrep 与 awk 支持扩展正则表达式。掌握基础正则表达式的使用方法,首先必须了解基本正则表达式所包含的元字符的含义,下面经过 grep 命令以举例的方式逐个介绍。
基础正则表达式示例:
查找特定字符很是简单,如执行如下命令便可从 test.txt 文件中查找出特定字符“the” 所在位置。其中“-n”表示显示行号、“-i”表示不区分大小写。命令执行后,符合匹配标准的字符,字体颜色会变为红色(本章中所有经过加粗显示代替)。
查找特定字符正则表达式

[root@localhost ~]# grep -n 'the' test.txt

shell编程之正则表达式(一)基础正则表达式

[root@localhost ~]# grep -in 'the' test.txt

shell编程之正则表达式(一)基础正则表达式
若反向选择,如查找不包含“the”字符的行,则须要经过 grep 命令的“-vn”选项实现。shell

[root@localhost ~]# grep -vn 'the' test.txt

shell编程之正则表达式(一)基础正则表达式
利用中括号“[]”来查找集合字符
想要查找“shirt”与“short”这两个字符串时,能够发现这两个字符串均包含“sh” 与“rt”。此时执行如下命令便可同时查找到“shirt”与“short”这两个字符串。“[]”中不管有几个字符,都仅表明一个字符,也就是说“[io]”表示匹配“i”或者“o”。编程

[root@localhost ~]# grep -n 'sh[io]rt' test.txt

shell编程之正则表达式(一)基础正则表达式
若要查找包含重复单个字符“oo”时,只须要执行如下命令便可。服务器

[root@localhost ~]# grep -n 'oo' test.txt

shell编程之正则表达式(一)基础正则表达式
若查找“oo”前面不是“w”的字符串,只须要经过集合字符的反向选择“[^]”来实现该目的,如执行“grep –n‘[^w]oo’test.txt”命令表示在 test.txt 文本中查找“oo” 前面不是“w”的字符串。网络

[root@localhost ~]# grep -n '[^w]oo' test.txt

shell编程之正则表达式(一)基础正则表达式
在上述命令的执行结果中发现“woood”与“wooooood”也符合匹配规则,两者均包含“w”。其实经过执行结果就能够看出,符合匹配标准的字符加粗显示,而上述结果中能够得知,“#woood #”中加粗显示的是“ooo”,而“oo”前面的“o”是符合匹配规则的。同理 “#woooooood #”也符合匹配规则。
若不但愿“oo”前面存在小写字母,可使用“grep –n‘[^a-z]oo’test.txt”命令实现,其中“a-z”表示小写字母,大写字母则经过“A-Z”表示。运维

[root@localhost ~]# grep -n '[^a-z]oo' test.txt

shell编程之正则表达式(一)基础正则表达式

[root@localhost ~]# grep -n '[^a-zA-Z]oo' test.txt

过滤以a-z,A-Z开头的字符串
查找包含数字的行能够经过“grep –n‘[0-9]’test.txt”命令来实现。编辑器

[root@localhost ~]# grep -n '[0-9]' test.txt

shell编程之正则表达式(一)基础正则表达式
查找行首“^”与行尾字符“$”
基础正则表达式包含两个定位元字符:“^”(行首)与“$”(行尾)。在上面的示例中,查询“the”字符串时出现了不少包含“the”的行,若是想要查询以“the”字符串为行首的行,则能够经过“^”元字符来实现。ide

[root@localhost ~]# grep -n '^the' test.txt

shell编程之正则表达式(一)基础正则表达式

[root@localhost ~]# grep -n '\.$‘’ test.txt

shell编程之正则表达式(一)基础正则表达式
当查询空白行时,执行“grep –n‘^$’test.txt”命令便可。工具

[root@localhost ~]# grep -n '^$' test.txt

shell编程之正则表达式(一)基础正则表达式
查找任意一个字符“.”与重复字符“*”post

[root@localhost ~]# grep -n 'w..d' test.txt

shell编程之正则表达式(一)基础正则表达式
”表明的是重复零个或多个前面的单字符。“o”表示拥有零个(即为空字符)或大于等于一个“o”的字符,由于容许空字符,因此执行“grep –n‘o’test.txt”命令会将文本中全部的内容都输出打印。若是是“oo”, 则第一个 o 必须存在,第二个 o 则是零个或多个 o,因此凡是包含 o、oo、ooo、ooo,等的资料都符合标准。同理,若查询包含至少两个 o 以上的字符串,则执行“grep –n‘ooo*’ test.txt”命令便可。

[root@localhost ~]# grep -n 'ooo*' test.txt

shell编程之正则表达式(一)基础正则表达式
查询以 w 开头 d 结尾,中间包含至少一个 o 的字符串,执行如下命令便可实现。

[root@localhost ~]# grep -n 'woo*d' test.txt

shell编程之正则表达式(一)基础正则表达式
查询以 w 开头 d 结尾,中间的字符无关紧要的字符串。

[root@localhost ~]# grep -n 'w.*d' test.txt

shell编程之正则表达式(一)基础正则表达式
查询任意数字所在行

[root@localhost ~]# grep -n '[0-9][0-9]*' test.txt

shell编程之正则表达式(一)基础正则表达式
查找连续字符范围“{}”
在上面的示例中,咱们使用“.”与“*”来设定零个到无限多个重复的字符,若是想要限制一个范围内的重复的字符串该如何实现呢?例如,查找三到五个 o 的连续字符,这个时候就须要使用基础正则表达式中的限定范围的字符“{}”。由于“{}”在 Shell 中具备特殊 意义,因此在使用“{}”字符时,须要利用转义字符“\”,将“{}”字符转换成普通字符。 “{}”字符的使用方法以下所示。
查询两个 o 的字符:

[root@localhost ~]# grep -n 'o\{2\}' test.txt

shell编程之正则表达式(一)基础正则表达式
查询以 w 开头以 d 结尾,中间包含 2~5 个 o 的字符串

[root@localhost ~]# grep -n 'wo\{2,5\}d' test.txt

shell编程之正则表达式(一)基础正则表达式
查询以 w 开头以 d 结尾,中间包含 2 以上 o 的字符串

[root@localhost ~]# grep -n 'wo\{2,\}d' test.txt

shell编程之正则表达式(一)基础正则表达式
元字符总结
shell编程之正则表达式(一)基础正则表达式
扩展正则表达式
一般状况下会使用基础正则表达式就已经足够了,但有时为了简化整个指令,须要使用范围更广的扩展正则表达式。例如,使用基础正则表达式查询除文件中空白行与行首为“#” 以外的行(一般用于查看生效的配置文件),执行“grep –v‘^$’test.txt | grep –v ‘^#’”便可实现。这里须要使用管道命令来搜索两次。若是使用扩展正则表达式,能够简化为“egrep –v‘^$|^#’test.txt”,其中,单引号内的管道符号表示或者(or)。
此外,grep 命令仅支持基础正则表达式,若是使用扩展正则表达式,须要使用 egrep 或 awk 命令。awk 命令在后面的小节进行讲解,这里咱们直接使用 egrep 命令。egrep 命令与 grep 命令的用法基本类似。egrep 命令是一个搜索文件得到模式,使用该命令能够搜索文件中的任意字符串和符号,也能够搜索一个或多个文件的字符串,一个提示符能够是单个字符、一个字符串、一个字或一个句子。
与基础正则表达式类型相同,扩展正则表达式也包含多个元字符,常见的扩展正则表达
式的元字符主要包括如下几个
shell编程之正则表达式(一)基础正则表达式

相关文章
相关标签/搜索