一、何为正则表达式
正则表达式是自定义的,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:]:代表空白字符
[^]:匹配指定范围之外的任意单个字符,如[^0-9]表示数字之外的任意单个字符
*:表示它前面的字符可以出现任意次
\?:表示它前面的字符可以出现1次或0次
\+:表示它前面的字符出现至少1次
\{m\}:表示它前面的字符要出现m次
\{m,n\}:表示它前面的字符出现至少m次,至多n次
\{m,\}:表示它前面的字符出现至少m次
\{0,n\}:表示它前面的字符出现至多n次
.*:表示任意长度的任意字符
2、位置锚定符
^:行首锚定,即要搜索的字串必须位于行首
$:行尾锚定
^$:空白行,同^[[:space:]]*$
\<:词首锚定(注:不包含特殊字符的连续字符组成的串叫“单词”)
\>:词尾锚定
3、分组和引用
\(\):分组,例如\(ab\)*表示ab可以出现任意次,分组中的模式匹配到的内容,可由正则表达式引擎记忆在内存中,之后可被引用
注意:反斜线为转义字符
\#:引用第#个括号所匹配到的内容,而非模式本身。
例如 abcmnabc匹配\(ab\?c\).*\1,而abcmnac不匹配
4、扩展正则表达式的特殊说明
?:表示它前面的字符可以出现1次或0次(不同于基本正则表达式)
+:表示它前面的字符出现至少1次
{m}:精确匹配m次
{m,n}:至少m次,至多n次
{m,}:至少m次
{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结尾的行
[[email protected] ~]# grep "bash$" /etc/passwdroot:x:0:0:root:/root:/bin/bashwittgenstein:x:500:500:wittgenstein:/home/wittgenstein:/bin/bash
2、显示/etc/passwd文件中的两位数或三位数
[[email protected] ~]# grep -o "\<[1-9][[:digit:]]\{1,2\}\>" /etc/passwd121014111210013...
3、显示`netstat -tan`命令结果中以‘LISTEN’后跟0个、1个或者多个空白字符结尾的行
[[email protected] ~]# netstat -tan | grep "LISTEN[[:space:]]*$"tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN ...
4、添加用户bash、testbash、basher以及nologin用户(nologin用户的shell为/sbin/nologin);而后找出/etc/passwd文件中用户名与其shell名相同的行
[[email protected] ~]# grep "^\([[:alnum:]]\+\):.*/\1$" /etc/passwdsync:x:5:0:sync:/sbin:/bin/syncshutdown:x:6:0:shutdown:/sbin:/sbin/shutdownhalt:x:7:0:halt:/sbin:/sbin/haltbash:x:501:501::/home/bash:/bin/bashnologin:x:504:504::/home/nologin:/sbin/nologin
5、显示当前系统上root、centos或者user1用户的默认shell和UID (请事先创建这些用户,若不存在)
[[email protected] ~]# grep -E "^root:|^centos:|^user1:" /etc/passwd | cut -d: -f3,70:/bin/bash505:/bin/bash506:/bin/bash
6、找出/etc/rc.d/init.d/functions文件中某单词(单词中间可以存在下划线)后面跟着一组小括号的行
[[email protected] ~]# grep "\<[[:alnum:]]*_*[[:alnum:]]*\>()" /etc/rc.d/init.d/functions | grep "\<[^(]"checkpid() {__readlink() {__fgrep() {daemon() {killproc() {pidfileofproc() {pidofproc() {status() {echo_success() {...
7、使用echo输出一个路径,而后用egrep找出其路径基名;进一步使用egrep取出其目录名
[[email protected] ~]# echo "/etc/rc.d/init.d/nfs/" | egrep -o "\<nfs/$" | cut -d"/" -f1nfs[[email protected] ~]# echo "/etc/rc.d/init.d/nfs/" | egrep -o ".+d\>"/etc/rc.d/init.d
8、找出ifconfig命令执行结果中1-255之间的数字
[[email protected] ~]# ifconfig | grep -E -o "\<[1-9][0-9]?\>|\<1[0-9][0-9]\>|\<2[0-4][0-9]\>|\<25[0-5]\>"294035192...