文章目录
- 七、正则表达式
- 7.1 什么是正则表达式
- 7.2 为什么使用正则表达式
- 7.3 如何学习正则表达式
- 7.4 如何使用正则表达式
- 7.5 基本正则表达式
- 7.6 扩展正则表达式
- 7.7 正则表达式案例
七、正则表达式
7.1 什么是正则表达式
正则表达式是通过一些特殊字符的排列,用以查找、替换、删除一行或多行文字字符串,简单的说,正则表达式就是用在字符串的处理上面的一项表示式。由于正则表达式语法简练,功能强大,得到了许多程序设计语言的支持,包括Java、C++、Perl以及Shell等。
7.2 为什么使用正则表达式
在进行程序设计的过程中,用户会不可避免地遇到处理某些文本的情况。有的时候,用户还需要查找符合某些比较复杂规则的字符串。对于这些情况,如果单纯依靠程序设计语言本身,则往往会使得用户通过复杂的代码来实现。但是,如果使用正则表达式,则会以非常简短的代码来完成。
7.3 如何学习正则表达式
- 重点在于理解元字符
- 掌握好正则表达式的语法
- 开拓思路,寻找最佳的表达方法
7.4 如何使用正则表达式
当一个正则表达式完成之后,并能够保证这个表达式一定是准确的,需要不断地测试才可以确定其正确与否。在不同的环境下,用户需要不同的工具来帮助他完成测试的过程。如果是在Shell命令行中,用户可以使用grep命令来测试。
grep家族有三大成员分别为:
grep:支持使用基本正则表达式。
egrep:支持使用扩展正则表达式。
fgrep:不支持使用正则表达式,即所有的正则表达式中的元字符都将作为一般字符,仅仅拥有其字面意义,不再拥有特殊意义。
grep命令的名称来自于全局搜索正则表达式并打印文本行(Global Search Regular Expression and Print out the line)的缩写。它是一个非常古老的UNIX命令,也是一种强大的文本搜索工具。grep命令使用正则表达式来搜索文本,并且把匹配的文本行打印出来。
grep命令根据用户指定的”pattern(过滤条件)“对目标文本逐行进行匹配检查;打印出符合条件的行,即文本搜索工具。
注
:PATTERN即过滤条件指由文本字符及正则表达式元字符所编写的字符串。
grep命令的基本语法如下:grep [options] pattern [file…]
在上面的语法中,options表示选项,选项列表如下表。pattern表示要匹配的模式,file表示一系列的文件名。grep命令会从一个或者多个文件中搜索满足指定模式的文本行,并且打印出来。模式后面的所有的字符串参数都被看作是文件名。
-n :显示行号
-o :只显示匹配的内容
-q :静默模式,没有任何输出,得用$?来判断执行成功没有,即有没有过滤到想要的内容
-l :如果匹配成功,则只将文件名打印出来,失败则不打印,通常-rl一起用,grep -rl 'root' /etc
-A :如果匹配成功,则将匹配行及其后n行一起打印出来
-B :如果匹配成功,则将匹配行及其前n行一起打印出来
-C :如果匹配成功,则将匹配行及其前后n行一起打印出来
--color:高亮颜色显示匹配到的字符串
-c :如果匹配成功,则将匹配到的行数打印出来
-E :等于egrep,扩展
-i :忽略大小写
-v :取反,不匹配
-w:匹配单词
-r:递归搜索,不仅搜索当前目录,还要搜索其各级子目录
-s:不显示关于不存在或者无法读取文件的错误信息
7.5 基本正则表达式
基本正则表达式(Basic Regular Expression,BRE),又称为标准正则表达式,是最早制订的正则表达式规范,仅支持最基本的元字符集。基本正则表达式是POSIX规范制订的两种正则表达式语法标准之一,另外一种语法标准称为扩展正则表达式。
示例:
• 1)^word 表示搜索以word开头的内容。
• 2)word$ 表示搜索以word结尾的内容。
• 3)^$ 表示空行,不是空格。
• 4). 代表且只能代表一个任意字符。
• 5)\ 转义字符,让有着特殊身份意义的字符失效。
例如:.只表示小数点,还原原始的小数点的意义。
• 6)* 重复0个或多个前面的字符
• 7).* 匹配所有的字符。^.* 任意多个字符开头。
• 8)[] 匹配字符集合内任意一个字符,如[a-z]
• 9)[^abc] ^在中括号里表示非,不包含a或b或c
• 10){n,m} 匹配n到m次,前一个字符。
{n,} 至少N次,多了不限。
{n,}{n} n次
{n,}{,m} 至多m次,少了不限。
• 注意
:grep要将{}转义,{},egrep不需要转义
• 12)(),定义子表达式的开始和结束位置。例如,正则表达式“(love).*\1”表示匹配2个“love”中间
包含任意个字符的文本行,其中“\1”表示引用前面的“love”
• 13)<或\b:锚定词首(支持vi和grep),其后面的任意字符必须作为单词首部出现,如 <love或\blove
• 14)>或\b:锚定词尾(支持vi和grep),其前面的任意字符必须作为单词尾部出现,如 love>或love\b
正则表达式字符集
7.6 扩展正则表达式
扩展正则表达式(Extended Regular Expression,ERE)支持比基本正则表达式更多的元字符,但是扩展正则表达式对有些基本正则表达式所支持的元字符并不支持。前面介绍的元字符“^”、“$”、“.”、“*”、 “[]”以及“[^]”这6个元字符在扩展正则表达式都得到了支持,并且其意义和用法都完全相同,不再重复介绍。接下来重点介绍一下在扩展正则表达式中新增加的一些元字符。
7.7 正则表达式案例
• 1、显示/etc/passwd文件中以bash结尾的行;
• 2、找出/etc/passwd文件中的三位或四位数;
• 3、找出/etc/grub2.cfg文件中,以至少一个空白字符开头,后面又跟了非空白字符的行;
• 4、找出"netstat -tan”命令的结果中,以‘LISTEN’后跟0个或多个空白字符结尾的行;;
• 5、找出"fdisk -l“命令的结果中,包含以/dev/后跟sd或hd及一个字母的行;
• 6、找出”ldd /usr/bin/cat“命令的结果中文件路径;
• 7、找出/proc/meminfo文件中,所有以大写或小写s开头的行;至少用三种方式实现;
• 8、显示当前系统上root、centos或spark用户的相关信息;
• 9、echo输出一个绝对路径,使用egrep取出其基名;
[root@localhost ~]#echo /mnt/sdc/ | grep -E -o "[^/]+/?$" | cut -d"/" -f 1
• 10、找出ifconfig命令结果中的1-255之间的整数;
• 11、找出系统中其用户名与shell名相同的用户。
○ [root@localhost ~]# grep "^\(.*\):.*\1$" passwd
练习:
1、显示/etc/rc.d/rc.sysinit文件中以不区分大小的h开头的行;
2、显示/etc/passwd中以sh结尾的行;
3、显示/etc/fstab中以#开头,且后面跟一个或多个空白字符,而后又跟了任意非空白字符的行;
4、查找/etc/rc.d/rc.local中包含“以to开始并以to结尾”的字串行;
5、查找/etc/inittab中含有“以s开头,并以d结尾的单词”模式的行;
6、查找ifconfig命令结果中的1-255之间的整数;
7、显示/var/log/secure文件中包含“Failed”或“FAILED”的行;
8、在/etc/passwd中取出默认shell为bash的行;
9、以长格式列出/etc/目录下以ns开头、.conf结尾的文件信息;
10、高亮显示passwd文件中冒号,及其两侧的字符;