您的位置:首页 > 运维架构 > Shell

shell浅谈之四正则表达式

2014-09-09 15:09 176 查看


一、简介

Shell中很多工具和命令普遍使用到了正则表达式,了解基本的正则表达式和扩展正则表达式中元字符的意义和用法对熟练使用Shell编程很有好处。

正则表达式RE(Regular Expression)是由一串字符和元字符构成的字符串,主要功能是文本查询和字符串操作,它可以匹配文本的一个字符或字符集合。用于数据流处理完成数据过滤 。


二、详解

POSIX分为基本的正则表达式和扩展的正则表达式,linux都支持基本的正则表达式。

1、基本正则表达式

(1)正则表达式的基本元素包括普通字符和元字符,如a、b、1等属于普通字符。而*、^、[]等元字符赋予了特殊的意义。





(2)方括号[]匹配字符集合,可以使用"-"表示字符集合范围(从"-"左边字符开始到"-"右边字符结束)。linux系统大小写敏感并且支持字母排序。

(3)"^"符号表示匹配行首,但“^”符号放到"[]"中就不再表示匹配行首了而是取反符号,例[^b-d]表示不在b~d范围内的所有字符(即包括其他字母、数字、空格等)。[A-Za-z][A-Za-z]*匹配任意英文单词。

(4)"\<\>"符号是精确匹配符号,如\<the\>精确匹配the单词,不匹配包括the字符的单词如them、there。

(5)"\{\}"系列符号可以指定重复次数("*"符号只能表示重复0次或任意次)。

2、扩展正则表达式

awk和perl等linux工具还支持正则表达式扩展出来的一些元字符。



(1)"?"至多可以匹配1个字符。"+"至少匹配一次。"*"可以匹配0次和多次。

(2)"("通常与"|"结合表示一组可选字符的集合。但"()"符号很少使用,因为"[]"完全能够代替"()"表示一组可选字符的集合。re(a|e|o)d就等价于re[aeo]d。

3、通配

(1)Bash shell本身不支持正则表达式,使用正则表达式的是Shell命令和工具如gerp、sed、awk等。但shell可以使用正则表达式中的一些元字符实现通配功能,最常用的通配符包括正则表达式元字符:?、*、[]、{}、^等,它们的意思和正则表达式中的意义不完全一致。

*符号不再表示其前面的字符的重复,而是表示任意位的任意字符。?字符表示一个任意字符。^符号在通配中不代表行首,而是代表取反。

(2)ls列出以a~h开头且不是以.txt结尾的文件,通配为[a-h]*.[^txt]*。"^"表示取反,"[]"符号的意义与正则表达式中的意义一样。

(3)正则表达式中只有在花括号前加上转义符的用法,即\{\}用于限制匹配字符的个数;而通配中{}符号表示一组表达式的集合例如{[a-h]*.txt, a?.log}表示满足[a-h]*.txt或a?.log的所有文件,{}内的表达式是或的关系。

(4)内部变量GLOBIGNORE保存了通配时所忽略的文件名集合,?、*、[]、{}、^五个符号和GLOBIGNORE变量构成了shell通配的所有内容。

(5)通配需搜索大量的文件或目录进行匹配而输出,对cpu和内存要求较高,黑客输入包含通配符的文件名故意让服务器重复和连续不断地进行通配可能引起拒绝服务攻击,因此服务器都限制执行通配功能的次数、限制一个用户每次输入的通配符。


三、总结

(1)Shell不支持正则表达式,其通配符与正则表达式中符号意义不完全一致。

(2)仅简单的介绍shell编程,其他更多的内容以后的开发中再详解。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: