shell 正则表达式


1.定义

所谓正则表达式,实际上就是用来描述某些字符串匹配规则的工具。
一个正则表达式是一个字符串,字符串里的字符被称为元字符,他们可能表达了比他们字面意思上更为丰富的含义。
在进行程序设计的过程中,用户会不可避免的遇到处理某些文本的情况。有的时候,用还需要查找符合某些复杂规则的字符串。对于这些情况,如果单纯的依靠程序设计语言本身,则往往会使得用户通过复杂的代码是实现,但是,如果用正则表达式,则会议非常简短的代码来完成。
当一个正则表达式完成以后,并能够保证这个表达式一定是正确的,需要不断的测试才可以确定其是否正确,在不同的环境中,用户需要通过不同的测试工具来完成。如果在shell中,可以通过grep命令开测试。

正则表达式的功能

匹配、切割、替换、获取

Shell 正则表达式分为两种:

基础正则表达式:BRE(basic regular express)
扩展正则表达式:ERE(extend regular express),扩展的表达式有+?|()

常用的正则表达式符号

基础正则表达式常用元字符

\       转义符,将特殊字符进行转义,忽略其特殊意义   例:\!、 \n 、 \$等
^     	匹配行首,awk中,^则是匹配字符串的开始      如:^hello 会匹配以 hello 开头的行
$     	匹配行尾,awk中,$则是匹配字符串的结尾      如,hello$ 会匹配以 hello 结尾的行
.     	匹配除换行符\n之外的任意单个字符,awk则中可以   如:l…e匹配包含一个l,后跟两个任意字符,然后跟一个e的行
[]    	匹配包含在`[字符]`之中的任意一个字符  如:[aoeiu]匹配任意一个元音字母
[^ ]  	匹配`[^字符]`之外的任意一个字符  如:[^0-9]匹配任意一位非数字字符
*     	匹配前面的一个字符或子表达式0次或任意多次  如:a*hello匹配所有0个或多个a后,紧跟hello的行。即hello前面可以有任意多个a
<     	边界符,匹配字符串开始
>     	边界符,匹配字符串结束
{ n } 或者 \{n\}   	匹配之前的项n次,n是可以为0的正整数  如:[0-9]{4} 或者 [0-9]\{4\}匹配4位数字
{n,} 或者 \{n,\}  	匹配之前的项至少需要匹配n次  如:[0-9]{2,} 匹配两位及以上的数字
{n,m} 或者 \{n,m\}	指定之前的项至少匹配n次,最多匹配m次,n<=m   [a-z]{6,8} 匹配 6?8 位的小写字母

扩展正则表达式元字符

?     	匹配之前的项1次或者0次  例: go?d,将匹配gd或god
+     	匹配之前的项1次或者多次  例:go+d,将匹配至少一个o,如god, good, goood等
|     	交替匹配`|`两边的任意一项  例:g(oo|la)d,将匹配good或者glad、“was|his”既会匹配包含“was”的行,或匹配包含“his”的行
()    	匹配表达式,创建一个用于匹配的子串  如“(dog)+”会匹配“dog” “dogdog” “dogdogdog”等,因为被()包含的字符会被当成一个整体

实例1

显示/proc/meminfo文件中以大小s开头的文件

第一种方法(基础正则表达式)

[root@yaoguang ~]# grep "^[sS]" /proc/meminfo 
SwapCached:            0 kB
SwapTotal:             0 kB
SwapFree:              0 kB
Shmem:             10212 kB
Slab:             105052 kB
SReclaimable:      74676 kB
SUnreclaim:        30376 kB
ShmemHugePages:        0 kB
ShmemPmdMapped:        0 kB

第二种方法(扩展正则表达式)

[root@yaoguang ~]# grep -E "^(s|S)" /proc/meminfo 
SwapCached:            0 kB
SwapTotal:             0 kB
SwapFree:              0 kB
Shmem:             10212 kB
Slab:             105052 kB
SReclaimable:      74676 kB
SUnreclaim:        30376 kB
ShmemHugePages:        0 kB
ShmemPmdMapped:        0 kB

第三种方法(grep)常规用法

[root@yaoguang ~]# grep -i "^s" /proc/meminfo 
SwapCached:            0 kB
SwapTotal:             0 kB
SwapFree:              0 kB
Shmem:             10212 kB
Slab:             105076 kB
SReclaimable:      74676 kB
SUnreclaim:        30400 kB
ShmemHugePages:        0 kB
ShmemPmdMapped:        0 kB