正则表达式与shell通配符
一、何为正则表达式 正则表达式是自定义的,linux文本工具(如grep,sed)用来过滤文本的模式模板,linux工具能够在数据流向工具时对数据进行正则表达式模式匹配,数据能匹配模式则会被接受进行下一步处理(如显示、删除、替代等)。正则表达式在shell和linux中的地位非常重要,透过正则表达式强大的字符串处理能力,我们可以从大量的数据中快速检索出仅符合需要的数据进行分析,由此给工作带来极大的便利 二、正则表达式的分类 正则表达式包括基本正则表达式(basic regular expression,简称BRE)和扩展正则表达式(ERE)两类,扩展正则表达式除了可以做简单的一组字串处理之外,还可以做群组的字串处理,如搜索china或america或england的搜索。大多数linux工具都至少符合基本正则表达式的规范。
三、正则表达式的语法 1、特殊字符 .:匹配任意单个字符 [ ]:匹配指定范围内的任意单个字符 [:alnum:]:代表英文大小写字符及数字,即a-z,A-Z,0-9 [:alpha:]:代表英文大小写字符,即a-z,A-Z [:upper:]:代表英文大写字符,即A-Z [:lower:]:代表英文小写字符,即a-z [:digit:]:代表数字,即0-9 [:space:]:代表空白字符 [:punct:]:所有的标点符号 [^]:匹配指定范围之外的任意单个字符,如[^0-9]或[^[:digit:]]表示数字之外的任意单个字符 *:表示它前面的字符可以出现任意次 ?:表示它前面的字符可以出现1次或0次 +:表示它前面的字符出现至少1次 {m}:表示它前面的字符要出现m次 {m,n}:表示它前面的字符出现至少m次,至多n次 {0,n}:表示它前面的字符出现至多n次 .*:表示任意长度的任意字符 2、位置锚定符 ^:行首锚定,即要搜索的字串必须位于行首 $:行尾锚定 ^$:空白行,同^[[:space:]]*$ &;:词首锚定(注:不包含特殊字符的连续字符组成的串叫“单词”) &;:词尾锚定 3、分组和引用 ():分组,例如(ab)*表示ab可以出现任意次,分组中的模式匹配到的内容,可由正则表达式引擎记忆在内存中,之后可被引用 注意:反斜线为转义字符 #:引用第#个括号所匹配到的内容,而非模式本身。 例如abcmnabc匹配(ab?c).*1,而abcmnac不匹配 4、扩展正则表达式的特殊说明 ?:表示它前面的字符可以出现1次或0次(不同于基本正则表达式) +:表示它前面的字符出现至少1次 {m}:精确匹配m次 {m,n}:至少m次,至多n次 {0,n}:至多n次 锚定符与基本正则表达式相同 分组:( ) 引用:# 或者:a|b,表示或者b。注意:conC|cat表示conC或者cat而非conCcat或者conccat 四、grep及egrep grep(global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用正则表达式对目标文件进行逐行搜索,并把匹配的行打印出来。egrep则是使用扩展正则表达式语法搜索文本的工具。 使用方法:grep [option]…… "PATTERN" FILE 常用选项: -i:忽略字符大小写 -v:反向选取 -o:仅显示匹配的字串,而非字串所在的行 -q:静默模式 --color=auto:将搜索匹配到的字串标示颜色 -A#:after,除了显示匹配行之外,也显示匹配行的后#行 -B#:before,除了显示匹配行之外,也显示匹配行的前#行 -C#或-#:除了显示符合匹配到的行之外,也显示该行之前后的#行内容 -E:使用扩展正则表达式,相当于egrep -n:在显示符合范本样式的那一行之前,标示出该行的编号 五、grep使用示例 1、显示/etc/passwd文件中以bash结尾的行 [root@localhost~]#grep"bash$"/etc/passwd root:x:0:0:root:/root:/bin/bash wittgenstein:x:500:500:wittgenstein:/home/wittgenstein:/bin/bash 2、显示/etc/passwd文件中的两位数或三位数 [root@localhost~]#grep-o"&;[1-9][[:digit:]]{1,2}&;"/etc/passwd 12 10 14 11 12 100 13 ... 3、显示`netstat -tan`命令结果中以‘LISTEN’后跟0个、1个或者多个空白字符结尾的行 [root@localhost~]#netstat-tan|grep"LISTEN[[:space:]]*$" tcp000.0.0.0:1110.0.0.0:*LISTEN tcp000.0.0.0:220.0.0.0:*LISTEN tcp00127.0.0.1:6310.0.0.0:*LISTEN ... 4、添加用户bash、testbash、basher以及nologin用户(nologin用户的shell为/sbin/nologin);而后找出/etc/passwd文件中用户名与其shell名相同的行 [root@localhost~]#grep"^([[:alnum:]]+):.*/1$"/etc/passwd sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown halt:x:7:0:halt:/sbin:/sbin/halt bash:x:501:501::/home/bash:/bin/bash nologin:x:504:504::/home/nologin:/sbin/nologin 5、显示当前系统上root、centos或者user1用户的默认shell和UID (请事先创建这些用户,若不存在) [root@localhost~]#grep-E"^root:|^centos:|^user1:"/etc/passwd|cut-d:-f3,7 0:/bin/bash 505:/bin/bash 506:/bin/bash 6、找出/etc/rc.d/init.d/functions文件中某单词(单词中间可以存在下划线)后面跟着一组小括号的行 [root@localhost~]#grep"&;[[:alnum:]]*_*[[:alnum:]]*&;()"/etc/rc.d/init.d/functions|grep"&;[^(]" checkpid(){ __readlink(){ __fgrep(){ daemon(){ killproc(){ pidfileofproc(){ pidofproc(){ status(){ echo_success(){ ... 7、使用echo输出一个路径,而后用egrep找出其路径基名;进一步使用egrep取出其目录名 [root@localhost~]#echo"/etc/rc.d/init.d/nfs/"|egrep-o"&;nfs/$"|cut-d"/"-f1 nfs [root@localhost~]#echo"/etc/rc.d/init.d/nfs/"|egrep-o".+d&;" /etc/rc.d/init.d 8、找出ifconfig命令执行结果中1-255之间的数字 [root@localhost~]#ifconfig|grep-E-o"&;[1-9][0-9]?&;|&;1[0-9][0-9]&;|&;2[0-4][0-9]&;|&;25[0-5]&;" 29 40 35 192 ... 六、shell通配符 通配符是由shell而非命令语句处理的,它只会出现在命令的参数里,以作为一种路径或文件名模板方便shell查找,匹配到的路径或文件则交由前面的命令处理。不同于正则表达式。 shell常用通配符: *:代表任意长度的任意字符 ?:代表一个任意字符 [ ]:代表指定范围内的一个字符,如[abc]代表a、b、c中的其中一个,[0-9]代表0到9之间的做任意一个数字 [! ]或[^ ]:取反,代表指定范围之外的任意单个字符,如[!abc]表示a、b、c之外的任意一个字符 {string1,string2...}:表示string1或string2,字符串之间以逗号相隔 [root@localhost~]#ls/etc/[!a-r]*.conf /etc/sestatus.conf/etc/sos.conf/etc/sudo-ldap.conf/etc/Trolltech.conf/etc/warnquota.conf/etc/yum.conf /etc/smartd.conf/etc/sudo.conf/etc/sysctl.conf/etc/updatedb.conf/etc/yp.conf [root@localhost~]#ls-l/etc/{sudo.conf,yum.conf} -rw-r-----.1rootroot1786Sep252012/etc/sudo.conf -rw-r--r--.1rootroot969Feb222013/etc/yum.conf (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |