正则表达式

PEGEXP:regular expressions,由一类特殊字符及文本字符所编写的模式,有些字符(元字符)不标识字符字面意义,而表示控制或通配的功能,类似于增强版的通配符功能,但与通配符不同,通配符功能是用来处理文件名,而正则表达式是处理文本内容中字符

  正则表达式被很多程序和开发语言所广泛支持:vim,less,sed,awk,nginx,mysql...

 

  正则表达式分两类:

  • 基本正则表达式:BRE
  • 扩展正则表达式:ERE

  正则表达式引擎:

  • 采用不同算法,检查处理正则表达式的软件模块,如:PCRE(Prel Compatible Regular Expressions)
  • 正则表达式的元字符分类:字符匹配、匹配次数、位置锚定、分组
  • 帮助:man 7 regex

基本正则表达式元字符

  字符匹配

 1 .             匹配任意单个字符,可以是一个汉字
 2 []            匹配指定范围内的任意单个字符,示例:[wang] [0-9] [a-z] [a-zA-Z]
 3 [^]           匹配指定范围外的任意单个字符,示例:[^wang]
 4 [:alnum:]     字母和数字
 5 [:alpha:]     代表任何英文大小写字符,亦即 A-Z, a-z
 6 [:lower:]     小写字母,示例:[[:lower:]],相当于[a-z]
 7 [:upper:]     大写字母
 8 [:blank:]     空白字符(空格和制表符)
 9 [:space:]     水平和垂直的空白字符(比[:blank:]包含的范围广)
10 [:cntrl:]     不可打印的控制字符(退格、删除、警铃...)
11 [:digit:]     十进制数字
12 [:xdigit:]    十六进制数字
13 [:graph:]     可打印的非空白字符
14 [:print:]     可打印字符
15 [:punct:]     标点符号

  例:

[root@centos8 ~]#ls /etc/ | grep rc[.0-6]
rc0.d
rc1.d
rc2.d
rc3.d
rc4.d
rc5.d
rc6.d
rc.d
rc.local
[root@centos8 ~]#ls /etc/ | grep rc[.0-6].
rc0.d
rc1.d
rc2.d
rc3.d
rc4.d
rc5.d
rc6.d
rc.d
rc.local
[root@centos8 ~]#ls /etc/ | grep rc[.0-6]\.
rc0.d
rc1.d
rc2.d
rc3.d
rc4.d
rc5.d
rc6.d

  匹配次数

  用在指定次数的后面,用户指定前面的字符要出现的次数

1 *       匹配前面的字符任意次,包括0次,贪婪模式:尽可能长的匹配,如:a* 表示a出现的任意次
2 .*          任意长度的任意字符
3 \?          匹配其前面的字符0或1次,即:可有可无
4 \+          匹配其前面的字符至少1次,即:肯定有,>=1
5 \{n\}       匹配前面的字符n次,如:a\{10\}
6 \{m,n\}     匹配前面的字符至少m次,至多n次
7 \{,n\}      匹配前面的字符至多n次,<=n
8 \{n,\}      匹配前面的字符至少n次

  例:

[root@CentOS8 ~]# echo /etc/ | grep "/etc/\?"
/etc/
[root@CentOS8 ~]# echo /etc | grep "/etc/\?"
/etc
#表示斜线“/”可有可无

  位置锚定

  位置锚定可以用于定位出现的位置

1 ^                 行首锚定,用于模式的最左侧
2 $                 行尾锚定,用于模式的最右侧
3 ^PATTERN$         用于模式匹配整行
4 ^$                空行
5 ^[[:space:]]*$    空白行
6 \< 或 \b          词首锚定,用于单词模式的左侧
7 \> 或 \b          词尾锚定,用于单词模式的右侧
8 \<PATTERN\>       匹配整个单词

  例:除掉空行和#开头的行

[root@CentOS8 ~]# grep -v ^$ /etc/profile | grep -v ^#

  分组

  分组:()将多个字符捆绑在一起,当做一个整体处理,如:\(root\)

  后向引用:分组括号中的模式匹配到的内容会被正则表达式引擎记录与内部的变量中,这些变量的命名方式为:\1,\2,\3...

  \1表示从左侧起第一个左括号以及与之匹配括号之间的模式所匹配到的字符

  例:

\(string1\(string2\)\)
\1:string1\(string\)
\2:string2
注意:后向引用 引用前面的分组括号中的模式所匹配字符,而非模式本身

  或者\|

  示例:

a\|b     #a或b
C\|cat   #C或cat
\(C\|C\) #Cat或cat

  例:排除空行和#开头的行

[root@centos6 ~]#grep -v ^# /etc/httpd/conf/httpd.conf |grep -v ^$
[root@centos6 ~]#grep -v ^#\|^$ /etc/httpd/conf/httpd.conf
[root@centos6 ~]#grep -v ^\(#\|$\) /etc/httpd/conf/httpd.conf
[root@centos6 ~]#grep "^[^#]" /etc/httpd/conf/httpd.conf

  正则表达式练习

1、显示/proc/meminfo文件中以大小s开头的行(要求:使用两种方法)
grep ^s\|^S /proc/meminfo 
grep ^\(S\|s\) /proc/meminfo
2、显示/etc/passwd文件中不以/bin/bash结尾的行
grep -v /bin/bash$ /etc/passwd
3、显示用户rpc默认的shell程序
grep ^rpc /etc/passwd | cut -d : -f 7
4、找出/etc/passwd中的两位或三位数
grep -E "\<[0-9]{2,3}\>" /etc/passwd
5、显示CentOS7的/etc/grub2.cfg文件中,至少以一个空白字符开头的且后面有非空白字符的行
grep "^[[:space:]]\+[^[:space:]]" /etc/grub2.cfg
6、找出“netstat -tan”命令结果中以LISTEN后跟任意多个空白字符结尾的行
netstat -tan | grep "LISTEN[[:space:]]\+$"
7、显示CentOS7上所有UID小于1000以内的用户名和UID
 [root@CentOS8 ~]# cat /etc/passwd | cut -d: -f1,3 |  grep -v "[0-9]\{4\}" | sort -t: -k2 -n
[root@CentOS8 ~]# cat /etc/passwd | cut -d: -f1,3 |  grep -v "[0-9]\{4\}" | sort -t: -k2 -nr
8、添加用户bash、testbash、basher、sh、nologin(其shell为/sbin/nologin),找出/etc/passwd用户
名和shell同名的行
[root@CentOS8 ~]# for i in bash testbash basher sh nologin; do useradd $i -s /sbin/nologin; done
[root@CentOS8 ~]# grep "^\(\<.*\>\).*\1$" /etc/passwd
或
[root@CentOS8 ~]# grep "^\(\<[[:alpha:]]\+\>\).*\1$" /etc/passwd
9、利用df和grep,取出磁盘各分区利用率,并从大到小排序
[root@CentOS8 ~]# df | grep "^/dev/sd" | tr -s " " %| cut -d% -f5 | sort -nr

 

扩展正则表达式

  字符匹配元字符

 1 .             匹配任意单个字符,可以是一个汉字
 2 []            匹配指定范围内的任意单个字符,示例:[wang] [0-9] [a-z] [a-zA-Z]
 3 [^]           匹配指定范围外的任意单个字符,示例:[^wang]
 4 [:alnum:]     字母和数字
 5 [:alpha:]     代表任何英文大小写字符,亦即 A-Z, a-z
 6 [:lower:]     小写字母,示例:[[:lower:]],相当于[a-z]
 7 [:upper:]     大写字母
 8 [:blank:]     空白字符(空格和制表符)
 9 [:space:]     水平和垂直的空白字符(比[:blank:]包含的范围广)
10 [:cntrl:]     不可打印的控制字符(退格、删除、警铃...)
11 [:digit:]     十进制数字
12 [:xdigit:]    十六进制数字
13 [:graph:]     可打印的非空白字符
14 [:print:]     可打印字符
15 [:punct:]     标点符号

  次数匹配

*      匹配前面字符任意次
?     0或1次
+      1次或多次
{n}    匹配n次
{m,n}  至少m次,至多n次

  位置锚定

^     行首
$     行尾
\<,\b 词首
\>,\b 词尾

  分组|或者

()         分组
后向引用:\1,\2,...
|          或者
a|b        #a或b
C|cat      #C或cat
(C|c)at    #Cat或cat

 

正则表达式

上一篇:S32 Design


下一篇:MyBatis多表关联查询