码迷,mamicode.com
首页 > 其他好文 > 详细

正则表达式和grep文本搜索工具

时间:2015-04-01 07:09:25      阅读:198      评论:0      收藏:0      [点我收藏+]

标签:正则表达式   grep   egrep   

正则表达式和文本搜索工具介绍

正则表达式:如果想搜索/etc/passwd文件中以root开头的行,对与人来说很容易理解,但是对与计算机来说就无法理解,这个时候就需要使用正则表达式来表达过滤条件了,让用户实现对文本的智能搜索。正则表达式就是由元字符及正常字符所书写的模式,其中的元字符不表示字符本身的意义,而是用于表达控制或通配等功能。


正则表达式的特点是:

1. 灵活性、逻辑性和功能性非常的强;

2. 可以迅速地用极简单的方式达到字符串的复杂控制。


grep:支持正则表达式,是一个文本搜索工具,根据用户指定的文本模式(正则表达式元字符以及正常字符组合而成),对目标文件进行逐行搜索,显示能匹配到的行。


egrep:支持扩展正则表达式,扩展正则表达式使用的元字符比基本正则表达式支持的元字符多一些,功能也要更强一些


fgrep:不支持正则表达式,但是搜索速度更快。


系统环境说明

[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语法:[OPTIONS] PATTERN [FILE...]


设置grep搜索显示颜色:

[root@localhost ~]# alias grep="grep--color"

注意:这种方法只是临时有效,重启后会丢失,把别名设置到开机启动文件中,重启系统之后依旧有效。


grep参数:

-v:表示取反

-i:不区分字符的大小写

-E:支持扩展正则表达式

-A:-A 2 显示指定行和指定行的后两行 中间使用两个横线分割

-B:显示匹配到前面的指定行数

-C:表示匹配到的内容的上下的指定行数

-o:只输出匹配内容

-n:在行首显示行号

演示说明:

-i 参数演示说明:在/etc/passwd中搜索ROOT, 不区分大小写,第一次搜索的是ROOT但是没有搜索到,添加-i参数之后就匹配到了root,说明搜索不区分大小写了。

技术分享

-C 参数演示说明:搜索/etc/passwd中redhat参数和匹配内容的上下各一行。

技术分享

-o 参数演示说明:搜索/etc/passwd中root参数,非root内容不予显示。

技术分享

-n 参数演示说明:输出匹配结果的行号。注意:这个行号不是按照匹配到的内容显示行号的,而是按照匹配行在文本中的所在行显示。

技术分享

正则表达使命令

字符匹配:

.:匹配任意单个字符

[]:匹配指定范围内的任意单个字符

[^]:匹配指定范围外的任意单个字符

[abc]  匹配字符集合内任意一个字符[a-z]

[:space:]:空白字符

[:punct:]:标点符号

[:lower:]:小写字母

[:upper:]: 大写字母

[:alpha:]: 大小写字母

[:digit:]: 数字

[:alnum:]: 数字和大小写字母



实例:

".":实例演示说明:显示/etc/passwd文件中,r开头t结尾,中间跟两个任意字符。

技术分享

[]:实例演示说明:显示/etc/passwd文件中包含FTP字符的行。

技术分享

显示/etc/passwd文件中包含数字的行。

技术分享

次数匹配:在期望匹配字符后面提供一个控制符,用于匹配

* :重复0个或多个前面的一个字符,匹配其前面字符任意次

.*:匹配所有字符。^.*任意多个字符开头

工作与贪婪模式,尽可能长的匹配。以这个表达式为例:a.*b,它将会匹配最长的以a开始,以b结束的字符串。

\?:0次或1次;表示其左侧字符可有可无

\+:1次或多次

\{m\}: m次;表示其左侧字符精确出现m次

\{m,n\}:至少m次,至多n次;


演示:

*:演示说明:显示/etc/passwd文件中r开头t结尾,中间要么出现包含o的内容,要么什么都不出现。

技术分享

.*:演示说明:显示/etc/passwd文件中r0开头t结尾,中间出现任意长度的任意字符。

技术分享

\?:演示说明显示/etc/passwd文件中包含ro开头t结尾,中间的o要是要么不出现,要么出现一次的行。

技术分享

\+:演示说明:显示/etc/passwd文件中包含ro开头t结尾,中间的o出现过1次或多次的行。

技术分享

\{m\}:演示说明:显示/etc/passwd文件中包含ro开头t结尾,中间的o出现两次的行。

技术分享


位置锚定:

^:行首

$:行尾

^$:匹配空白行

实例:

^:演示说明:显示/etc/passwd文件中以root开头的行

技术分享

$:演示说明:显示/etc/passwd文件中以/bin/bash结尾的行


单词锚定:由非字符组成的连续的字符串

\<:锚定词首

\b:锚定词首

\>:锚定词尾,也可以用\b

\<PATTERN\>:匹配PATTERN能匹配到的单词


示例:

\<和\b:演示说明:显示/etc/passwd文件中以sh开头的单词

技术分享

\>和\b: 演示说明:显示/etc/passwd文件中以sh结尾的单词

技术分享


分组:\(\)

重复单个字符直接在字符后面加上限定符号即可,但是如果想重复多个字符就不是限定符号可以搞定的,这个时候就需要用到分组。

分组的模式:在某次的具体匹配过程中所匹配到的字符,可以被grep记忆(保存于内置的变量中,这些变量是\1,\2,……),因此,还可以被引用

实例说明:

把括号中的root当成一类字符,在加上*表示,roo要么显示一次,要么就不显示。

技术分享

显示:r..t匹配到的字符在结尾在出现一次,也就是匹配以r..t开头,以r..t结尾的文件

技术分享

综合使用方法:

找出/etc/passwd文件中的一位数或两位数;

# grep "\<[0-9]\{1,2\}\>" /etc/passwd


显示/boot/grub/grub.conf中以至少一个空白字符开头的行;

# grep "^[[:space:]]\+" /boot/grub/grub.conf


显示/etc/rc.d/rc.sysinit文件中以#开头,后面跟至少一个空白字符,而后又有至少一个非空白字符的行;

# grep "^#[[:space:]]\+[^[:space:]]\+" /etc/rc.d/rc.sysinit



扩展正则表达式

可以使用grep e或者egrep来使用

字符匹配:

表示方法和grep一样,不在提供实例

.:匹配任意单个字符

[]:匹配指定范围内的任意单个字符

次数匹配:

说明:扩展正则表达式的次数匹配前面不需要加转移字符。

*:任意次

?:0或1次

+:至少一次

{m}:精确匹配m次

{m,n}:至少m次,至多n次

{m,}:至少m次

{0,n}:至多次


?和+:演示说明:和正则表达式的区别就在于没有加"\"

技术分享

{}演示:同样也是没有加"\",使用起来方便了很多

技术分享

位置锚定:

^:锚定行首

$:锚定行尾

\<,\b:锚定词首

\>,\b:锚定词尾


技术分享

分组:

():不需要使用\转义

引用:

\1,\2,\3


显示/etc/passwd文件中root开头root结尾的行

技术分享

或者:

这个是基本正则表达式所不具备的功能,意思是使用两个条件一起搜索,两个条件可以同时满足,也可以只满足其中一个,但是不能一个都无法满足。


a|b:a或者b


演示说明:显示/etc/passwd文件中的redhat和centos用户的信息。

技术分享

显示/etc/passwd文件中redhat和fedora的信息,但是由于没有fedora的信息所以只显示了redhat用户的信息。

技术分享






本文出自 “梅花香自苦寒来” 博客,请务必保留此出处http://ximenfeibing.blog.51cto.com/8809812/1627111

正则表达式和grep文本搜索工具

标签:正则表达式   grep   egrep   

原文地址:http://ximenfeibing.blog.51cto.com/8809812/1627111

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!