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