正则表达式和文本搜索工具介绍
什么是正则表达式:
正则表达式是由一组分别表示不同含义的特殊字符组成。比如,想搜索/etc/passwd文件中以root开头的行,对与人来说很容易理解,但是对与计算机来说就无法理解,这个时候就需要使用正则表达式来表达过滤条件了,让用户实现对文本的智能搜索。正则表达式就是由元字符及正常字符所书写的模式,其中的元字符不表示字符本身的意义,而是用于表达控制或通配等功能。
说明:虽然正则表达式和通配符使用的有些字符一样,但是表达的含义不相同。
正则表达式的特点是:
1. 灵活性、逻辑性和功能性非常的强;
2. 可以迅速地用极简单的方式达到字符串的复杂控制。
如何使用正则表达式:正则表达式是一种表示法,而不是一个工具,正则表达式需要配合工具才可以使用,如grep,sed,awk等工具都支持正则表达式,也正是因为他们支持正则表达式,所以才显得很强大。本文是根据grep来介绍正则表达式的使用。
grep:支持正则表达式,是一个文本搜索工具,根据用户指定的文本模式(正则表达式元字符以及正常字符组合而成),对目标文件进行逐行搜索,显示能匹配到的行。
egrep:支持扩展正则表达式,扩展正则表达式使用的元字符比基本正则表达式支持的元字符多一些,功能也要更强一些
系统环境说明
[root@localhost ~]# cat /etc/redhat-release
CentOS release 6.6 (Final)
[root@localhost ~]# uname -rm
2.6.32-504.el6.x86_64 x86_64
grep过滤命令参数说明和演示
grep语法:
grep [OPTIONS] '搜索的内容' [FILE...]
grep默认搜索是没有颜色显示的,这样就无法快速定位匹配内容,而设置了显示颜色之后,匹配到的内容就会显示红色,可以让我们快速定位匹配内容。
[root@localhost ~]# alias grep="grep--color"
注意:这种方法只是临时有效,重启后会丢失,把别名设置到开机启动文件中,重启系统之后依旧有效。
grep参数:
-v:表示取反,即显示没有匹配到的行
-i:不区分字符的大小写
-E:支持扩展正则表达式
-A:显示匹配到的行后面的指定行数
-B:显示匹配到的行前面的指定行数
-C:表示匹配到的行上下的指定行数
-n:在行首显示行号
-c:计算找到符合行的次数
演示说明:
-i 参数演示说明:在/etc/passwd中搜索ROOT, 不区分大小写,第一次搜索的是ROOT但是没有搜索到,添加-i参数之后就匹配到了root,说明搜索不区分大小写了。
-C 参数演示说明:搜索/etc/passwd中redhat参数和匹配内容的上下各一行。
-o 参数演示说明:搜索/etc/passwd中root参数,非root内容不予显示。
-n 参数演示说明:输出匹配结果的行号。注意:这个行号不是按照匹配到的内容显示行号的,而是按照匹配行在文本中的所在行显示。
正则表达使命令
字符匹配:
.:匹配任意单个字符
[]:匹配指定范围内的任意单个字符,例如[abc]表示a、b、c其中一个
[^]:匹配指定范围外的任意单个字符
[:space:]:空白字符
[:punct:]:标点符号
[:lower:]:小写字母
[:upper:]: 大写字母
[:alpha:]: 大小写字母
[:digit:]: 数字
[:alnum:]: 数字和大小写字母
演示说明:
".":演示说明:显示/etc/passwd文件中,r开头t结尾,中间跟两个任意字符。
[]:实例演示说明:显示/etc/passwd文件中包含FTP字符的行。(只要包含FTP字符中的任意一个即可)
404qRQLo149.jpg">
次数匹配:在期望匹配字符后面提供一个控制符,用于匹配
* :重复0个或多个前面的一个字符,匹配其前面字符任意次
.*:匹配所有字符。^.*任意多个字符开头,工作与贪婪模式,尽可能长的匹配。以这个表达式为例:a.*b,它将会匹配最长的以a开始,以b结束的字符串。
\?:0次或1次;表示其左侧字符可有可无
\+:1次或多次
\{m\}: m次;表示其左侧字符精确出现m次
\{m,n\}:表示其左侧字符,至少出现m次,至多出现n次
演示:
*:演示说明:显示/etc/passwd文件中r开头t结尾,中间要么出现包含o的内容,要么什么都不出现。
.*:演示说明:显示/etc/passwd文件中ro开头t结尾,中间出现任意长度的任意字符。
\?:演示说明:显示/etc/passwd文件中包含ro开头t结尾,中间的o要是要么不出现,要么出现一次的行。
\+:演示说明:显示/etc/passwd文件中包含ro开头t结尾,中间的o出现过1次或多次的行。
\{m\}:演示说明:显示/etc/passwd文件中包含ro开头t结尾,中间的o出现两次的行。
位置锚定:
^:行首
$:行尾
^$:匹配空白行
^:演示说明:显示/etc/passwd文件中以root开头的行
单词锚定:锚定一个文档中指定单词的开头和结尾的字符
\<:锚定词首
\b:锚定词首
\>:锚定词尾,也可以用\b
\<PATTERN\>:匹配PATTERN能匹配到的单词
\<和\b:演示说明:显示/etc/passwd文件中以sh开头的单词
\>和\b: 演示说明:显示/etc/passwd文件中以sh结尾的单词
分组:\(\)
重复单个字符直接在字符后面加上限定符号即可,但是如果想重复多个字符就不是限定符号可以搞定的,这个时候就需要用到分组。
分组的模式:在某次的具体匹配过程中所匹配到的字符,可以被grep记忆(保存于内置的变量中,这些变量是\1,\2,……),因此,还可以被引用
把括号中的root当成一类字符,在加上*表示,roo要么显示一次,要么就不显示。
显示:r..t匹配到的字符在结尾在出现一次,也就是匹配以r..t开头,以r..t结尾的文件
扩展正则表达式
可以使用grep -e或者egrep来使用
表示方法和grep一样,不在提供实例
[]:匹配指定范围内的任意单个字符,[^]表示取反
次数匹配:
说明:扩展正则表达式的次数匹配前面不需要加转移字符。
*:任意次
?:0或1次
+:至少一次
{m}:精确匹配m次
{m,n}:至少m次,至多n次
{m,}:至少m次
{0,n}:至多次
?和+:演示说明:和正则表达式的区别就在于没有加"\"
{}演示说明:同样也是没有加"\",使用起来方便了很多
^:锚定行首
$:锚定行尾
\<,\b:锚定词首
\>,\b:锚定词尾
演示说明:显示/etc/passwd文件中以sh开头,然后在显示以sh结尾的单词。
分组:
():不需要使用\转义
引用:
\1,\3
演示说明:显示/etc/passwd文件中root开头root结尾的行
或者:
这个是基本正则表达式所不具备的功能,意思是使用两个条件一起搜索,两个条件可以同时满足,也可以只满足其中一个,但是不能一个都无法满足。
如:a|b:表达的意思就是搜索的结果是a或者b。
演示说明:显示/etc/passwd文件中的redhat和centos用户的信息。
显示/etc/passwd文件中redhat和fedora的信息,但是由于没有fedora的信息所以只显示了redhat用户的信息。