Centos系统下载大全 | Redhat系统下载大全 | Windows2012系统下载大全 | Windows2008系统下载大全| CMS教程 | 网站地图 51运维网-专注Linux/Unix系统安全运维!
当前位置:51运维网 > 编程 > Shell > 正文

Shell语言七 正则表达式

时间:2014-05-31 00:25 来源:未知 作者:www.51ou.com 阅读:

正则表达式是指一类字符书写的模式(pattern),这类字符为元字符,即该字符不表示本来的意思,而用来作为通配符进行额外功能的描述。如*表示任意长度的任意字符,?表示任意单个字符。

我们可以使用man命令来查看一下正则表达式中元字符的含义:

# man 7 regex

wKioL1NrmVOBQASXAAQf0yOYGp8174.jpg

 

正则表达式包括两类:基本正则表达式,扩展正则表达式。

grep命令只支持基本正则表达式;egrep支持扩展正则表达式(e及表示扩展),fgrep表示fast grep,不支持正则表达式,所有的元字符都被当做普通字符处理,搜索速度很快。

 

这里着重介绍基本正则表达式。

前文中介绍过显示出文件 /etc/passwd中所有出现 “root”的行,但如果现在要显示的是只出现在行首的“root”,就需要使用含有元字符的正则表达式了。

正则表达式的模式主要有以下几种:

 

^pattern :表示锚定行首的符合条件的内容

故上述情况可以进行以下操作:

# grep --color=auto ‘^root’ /etc/passwd

 

pattern$:表示锚定行尾的符合条件的内容,因为$表示行结束符

故要查找行尾含有“sh”的行,可进行以下操作:

# grep --color=auto ‘sh$’ /etc/passwd

wKiom1Npq4SSGFtCAAJXsfgaqJ8457.jpg

 

若^和$同时使用,则可以用来表示自成一行的行,如grep --color=auto ‘^root$’ /etc/passwd就表示只有root出现的这一行;^$更多的时候可以用来查找空白行,如要查找并统计/etc/rc.d/rc.sysinit中的空白行,可以使用以下命令:

# grep “^$” /etc/rc.d/rc.sysinit

# grep “^$” /etc/rc.d/rc.sysinit | wc -lwKioL1Npq8jDkZxpAAEEDhzGEkw330.jpg

 

.:匹配任意单个字符

*:和通配符中的*号不同,正则表达式中的*表示匹配紧挨在其前面的字符的任意次,如 a*可以表示a,aa...;a*b可以表示b,ab,aab,而acb不匹配,但是以“a*b”为条件来在查找字符串时,acb则能够匹配,因为它表示b前面的字符串里含有任意个a:

如进行以下操作:

# nano grep.txt//输入 a,ab,aab,acb

# grep --color=auto “a*b” grep.txt

wKiom1Npq7eTg1RRAAFJi0j43Kw197.jpg

 

.*:表示匹配任意次数的任意字符:和普通的通配符不同,只用*不足以表示任意次数的任意字符,需要在*前面加上.

如要查找某一行中含有r开头以h结尾字段,可以使用“r.*h”,

   # grep --color=auto “r.*h” /etc/passwd

# grep --color=auto “^r.*h$” /etc/passwd            //以r开头,以h结尾的行

# grep --color=auto “^r.*h$” /etc/passwd          //包含以下字段:“r后面跟了一个数字,

              //数字后面跟了任意内容,以h结尾”

比较有趣的现象是在使用正则表达式进行匹配时,不以首次出现模式进行匹配,而是尽可能长的进行匹配。此模式称为“贪婪模式”

wKioL1Npq_exzFw8AAJ5aNCMs7Y608.jpg

 

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

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

[a-z], [A-Z]:所有的英文字母

[0-9]:所有的数字

[:lower:]:所有的小写字母

[:upper:]:所有的大写字母

[:digit:]:所有的数字

[:alpha:]:所有的字母

[:alnum:]:所有的数字和大小写字母

[:space:]:所有的空格

[:punct:]:所有的标点符号

若表示任意范围内的单个字符,中括号外还需要再套一层中括号,即[[:lower:]]

# grep --color=auto “r[0-9].*h” /etc/passwd      //包含以下字段:“r后面跟了一个数字,

           //数字后面跟了任意内容,以h结尾”

 

# grep “#[[]:space:]]\{1,\}[^[:space:]]” /etc/rc.d/rc.sysinit  //显示/etc/rc.d/rc.sysinit中 

                                                             //以#开头,且后面跟一个或

                                           //多个空白字符,而后又跟了任意非空白字符的行

wKiom1NrmuiSZrspAAL7SVZ9SMk775.jpg

\?:匹配紧挨在其前面的字符0次或1次

如 a\?b 可以匹配 ab, aab, acb, b, 在使用命令时,?前面要加上反斜线进行转移,如:

# grep --color=auto “a\?b” grep.txt

wKiom1NprGuR5yVfAAHJLpfL2Qg160.jpg

 

\{m,n\}:匹配前面的字符至少m次,至多n次;

\{0,n\}:匹配至多n次,0-n次;

\{m,\}:匹配至少m次。

比如a\{0,3\}b 能匹配b, ab, aab, aaab; aaaaaab 和 acb不匹配,因为b前面至多3个a。

wKiom1NprJ_w8NXUAAJ6OU0WZPE516.jpg

如以下例子:

  # grep “[bB].\{2,5\}[tT]” /etc/rc.d/rc.sysinit      // 查找/etc/rc.d/rc.sysinit文件中以大

               //小写任意的B开头,中间跟了2到5

               //个字符,并以大小写任意的T结尾的行

\<’pattern’ 或 \b’pattern’:表示锚定词首,即只匹配指定的单词而前面不包含特殊字符。

’pattern’\> 或 ’pattern’\b:表示锚定词尾,即只匹配指定的单词而后面不包含特殊字符。

\<’pattern’\> 或 \b’pattern’\b:表示锚定单词本身

例如:

# grep “\<[bB].\{2,5\}[tT]” /etc/rc.d/rc.sysinit         // 查找/etc/rc.d/rc.sysinit文件中含有以大

                   //小写任意的B开头,并以大小写任意的T结

                   //尾的单词的行

# grep “[bB].\{2,5\}[tT]\>” /etc/rc.d/rc.sysinit

# grep “\<[bB].\{2,5\}[tT]\>” /etc/rc.d/rc.sysinit

wKioL1NprMCCEdSDAAX-wBROJ5k903.jpg

 

\(‘pattern’\):表示分组。例如\(ab\){1,3}可以匹配ab,aab,abb,abab,ababab

# grep --color=auto “\(ab\)\{1,3\}” grep.txt

wKiom1NprWiwRcoJAAGlxTcKskE630.jpg

 

grep命令在使用正则表达式时也可以引用变量,注意要使用变量,需要用双引号;若使用单引号,则表示寻找引号内的字符串,而不是变量。如:

# UserName=root// 查找/etc/passwd文件中以root开头的行

# grep “^$UserName” /etc/passwdwKiom1Nprf3zvyIUAAEmYSeS57I968.jpg

 

上述分组匹配也可以引用变量。例如:“ab任意字符ab”可以写作“ab.*ab”。“a.b任意字符a.b”可能出现的结果是“acb_$?_aeb”,但实际希望的效果是 “acb_$?_acb”,这时就可以使用变量来实现:

# grep \(a.b\).*\1 //这里数字1就是用来引用第一次匹配出来的结果

wKioL1Nrn03TLoOKAARt8YJSVfc243.jpg

下面看一个有趣的例子,从下列文本中找出以下模式:

(l开头,两个任意字符,以e结尾)任意字符(和前面的模式一致,但末尾多了一个r)

He like his liker

       He love his liker

       She love her lover

       She like her lover

可以进行以下操作:

# grep “l..e.*l..er” grep.txt

# grep “\(l..e\).*\1r” grep.txt

wKiom1NprjOySnzdAAKthOSiF_o119.jpg

感谢您对【51运维网 http://www.51ou.com/】的支持,我们为您免费提供《Shell语言七 正则表达式》技术文章,《Shell语言七 正则表达式》详细使用和说明,有时《Shell语言七 正则表达式》可能不完善、敬请谅解!如果《Shell语言七 正则表达式》有错误请给我们留言,我们将尽快修复文章错误,如果您觉得本站不错,请分享给周围的朋友!谢谢!

顶一下
(0)
0%
踩一下
(0)
0%
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
验证码:点击我更换图片