正则表达式
正则表达式由一类特殊字符及文本字符所编写的模式。类似增强版的通配符
正则表达式分为2类
- 基本正则表达式
- 扩展正则表达式
正则表达式的元字符分类:字符匹配、匹配次数、位置锚定、分组
1.1 基本正则表达式
1.1.1 字符匹配
-
. 匹配任意单个字符,可以是一个汉字
-
[] 匹配指定范围内的任意单个字符
-
[^] 匹配指定范围外的任意单个字符
-
[:alnum:] 字母和数字
-
[:alpha:] 任何大小写字母
-
[:lower:] 小写字母
-
[:upper:] 大写字母
-
[:blank:] 空白字符
-
[:space:]水平和垂直的空白字符 (比[:blank:]范围广)
-
[:cntrl:] 不可打印字符(退格、删除、警铃)
-
[:digit:] 十进制数字
-
[:xdigit:] 十六进制数字
-
[:graph:] 可打印的非空白字符
-
[:print:] 可打印字符
-
[:punct:] 标点符号
[root@centos8 ~]#df |grep '/dev/sda'
/dev/sda2 104806400 2151100 102655300 3% /
/dev/sda3 52403200 398588 52004612 1% /data
/dev/sda1 999320 121872 808636 14% /boot
1.1.2 匹配次数
用在指定次数的字符后面,指定前面的字符要出现的次数
- * 匹配前面的字符任意次包括0次,贪婪模式:尽可能长的匹配
- .* 任意长度的任意字符
- \? 匹配其前面的字符0或1次,即可有可无
- \+ 至少一次
- \{n\} 匹配前面的字符n次
- \{m,n\} 匹配前面的字符最少m次,至多n次
- \{,n\} 匹配前面的字符至多n次
- \{n,\} 匹配前面的字符至少n次
范例:
[root@centos8 ~]#cat test.txt
ggle
gogle
google
gooogle
gooooooogle
[root@centos8 ~]#cat test.txt |grep 'go\?gle'#o可有可无
ggle
gogle
[root@centos8 ~]#cat test.txt |grep 'go\{2,\}gle' #o至少2次
google
gooogle
gooooooogle
范例:匹配正负数
[root@centos8 ~]#echo -1 -2 123 -123 234 |grep -o '\-\?[0-9]\+'
-1
-2
123
-123
234
[root@centos8 ~]#echo -1 -2 123 -123 234 |grep -o '\-[0-9]\+' #匹配负数
-1
-2
-123
[root@centos8 ~]#echo -1 -2 123 -123 234 |tr -s ' ' '\n'|grep -o '^[0-9]\+' #匹配正数
123
234
1.1.3 位置锚定
位置锚定可有用于定位出现的位置
- ^ 最左侧,首
- $ 行尾锚定,最右侧
- ^PATTERN$ 匹配整行
- ^$ 空行
- ^[[:space:]]$ 空白行
- < \b 词首锚定
- > \b 词尾锚定
- <PATTERN> 匹配整个单词
注意:单词由字母,数字,下划线组成
范例:排除掉空行和#开头的行
[root@centos8 ~]#grep -v '^$' /etc/fstab |grep -v '^#'
UUID=2c9481a3-891b-48a7-b78f-6d5cda779b42 / xfs defaults 0 0
UUID=99b1be82-b1e4-4f50-a094-cb8addda4565 /boot ext4 defaults 1 2
UUID=0d7156d8-588f-4b42-9a02-094c73581b16 /data xfs defaults 0 0
UUID=61a1ee96-b3ba-4671-9e15-8bbeb5b505a1 swap swap defaults 0 0
[root@centos8 ~]#grep '^[^$#]' /etc/fstab
UUID=2c9481a3-891b-48a7-b78f-6d5cda779b42 / xfs defaults 0 0
UUID=99b1be82-b1e4-4f50-a094-cb8addda4565 /boot ext4 defaults 1 2
UUID=0d7156d8-588f-4b42-9a02-094c73581b16 /data xfs defaults 0 0
UUID=61a1ee96-b3ba-4671-9e15-8bbeb5b505a1 swap swap defaults 0 0
1.1.4 分组其他
1.1.4.1 分组
分组:()将多个字符捆绑在一起,当做一个整体。如:(root)
后向引用:分组括号中的内容会被正则表达式引擎记录于内部的变量中,这些变量的命名方式为:\1,\2,\3 …
\1表示从左侧第一个左括号以及与之匹配的右括号之间的匹配的字符
\(string1\(string2\)\)
\1: string\(string2\)
\2:string2
注意:后向引用前面的分组括号中的模式所匹配的字符,而非模式本身
1.1.4.2 或者
或者 \|
a\|b a或b
C\|cat C或cat
\(C\|c\)at Cat或cat
范例:排除空行和#开头的行
[root@centos8 ~]#grep -v '^$\|^#' /etc/fstab
UUID=2c9481a3-891b-48a7-b78f-6d5cda779b42 / xfs defaults 0 0
UUID=99b1be82-b1e4-4f50-a094-cb8addda4565 /boot ext4 defaults 1 2
UUID=0d7156d8-588f-4b42-9a02-094c73581b16 /data xfs defaults 0 0
UUID=61a1ee96-b3ba-4671-9e15-8bbeb5b505a1 swap swap defaults 0 0
1.2 扩展正则表达式
1.2.1 字符匹配元字符
- . 任意单个字符
- [wang] 指定范围内的字符
- [^wang] 不在指定范围内的字符
- [:alnum:] 字母和数字
- [:alpha:] 字母大小写
- [:lower:] 小写字母
- [:upper:] 大写字母
- [:blank:] 空白字符(空格和制表符)
- [:space:] 水平和垂直的空白符
- [:cntrl:] 不可打印字符(退格,删除…)
- [:digit:] 十进制数字
- [:xdigit:] 十六进制数字
- [:graph:] 可打印的非空白字符
- [:print:] 可打印字符
- [:punct:] 标点符号
1.2.2 次数匹配
- * 匹配前面字符任意次
- ? 0或1次,可有可无
- + 至少1次
- {n} 匹配n次
- {m,n} 至少m次,至多n次
1.2.3 位置锚定
- ^ 行首
- $ 行尾
- \< ,\b 语首
- \> , \b 语尾
1.2.3 分组其他
()分组
后向引用 \1,\2,…
| 或者
a|b a或b
C|cat C或cat
(C|c)at Cat或cat