shell-正则表达式

一、正则表达式介绍

正则表达式是一种文本模式匹配,包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为”元字符”)。它是一种字符串匹配的模式,可以用来检查一个字符串是否含有某种子串、将匹配的子串替换或者从某个字符串中取出某个条件的子串。

正则表达式就像数学公式一样,我们可以通过正则表达式提供的一些特殊字符来生成一个匹配对应字符串的公式,用此来从海量数据中匹配出自己想要的数据。

正则表达式是一个三方产品,被常用计算机语言广泛使用,比如:shell、PHP、python、java、js等!

shell也支持正则表达式,但不是所有的命令都支持正则表达式,常见的的命令中只有grep、sed、awk命令支持正则表达式。

特殊说明

测试数据: #cat  file
ac
ab
abbc
abcc
aabbcc
abbbc
abbbbbc
acc
abc
asb
aa
bb
a_c
aZc
aAAAAc
a c
ABC
ccc
dddd
http://www
abababab
c c d
123
a3c
e*f

二、特殊字符

定位符使用技巧:同时锚定开头和结尾,做精确匹配;单一锚定开头和结尾,做模糊匹配。

定位符

说明

^

锚定开头 ^a 以a开头 默认锚定一个字符

$

锚定结尾 a$ 以a结尾 默认锚定一个字符

测试案例

1)精确匹配  以a开头c结尾的字符串
[root@www ~]# egrep "^ac$" file 
ac
2)模糊匹配  以a开头
[root@www ~]# egrep "^a" file 
ac
ab
abbc
abcc
aabbcc
abbbc
abbbbbc
acc
abc
asb
aa
a_c
aZc
aAAAAc
a c
abababab
a3c
3)模糊匹配 以c结尾的字符串
[root@www ~]# egrep "c$" file 
ac
abbc
abcc
aabbcc
abbbc
abbbbbc
acc
abc
a_c
aZc
aAAAAc
a c
ccc
a3c

匹配符:匹配字符串

匹配符

说明

.

匹配除回车以外的任意字符

( )

字符串分组

[ ]

定义字符类,匹配括号中的一个字符

[ ^ ]

表示否定括号中出现字符类中的字符,取反。

\

转义字符

|

测试案例

1)精确匹配  以a开头c结尾  中间任意  长度为三个字节的字符串
[root@www ~]# egrep "^a.c$" file 
acc
abc
a_c
aZc
a c
a3c
2)模糊匹配  以cc结尾的字符串   因为$只能锚定单个字符,如果是一个字符串就需要用()来做定义
[root@www ~]# egrep "(cc)$" file 
abcc
aabbcc
acc
ccc
3)精确匹配  以a开头c结尾  中间是a-z,0-9  长度为三个字节的字符串
[root@www ~]# egrep "^a[a-z0-9]c$" file 
acc
abc
a3c
4)精确匹配  以a开头c结尾  中间不包含a-z,0-9  长度为三个字节的字符串
[root@www ~]# egrep "^a[^a-z0-9]c$" file 
a_c
aZc
a c
5)精确匹配  以e开头f结尾  中间是*号  长度为三个字节的字符串  e*f
[root@www ~]# egrep "^e\*f$" file 
e*f
6)精确匹配 以a开头b或c结尾  中间是任意  长度为三个字节的字符串
[root@www ~]# egrep "^a.(b|c)$" file 
acc
abc
asb
a_c
aZc
a c
a3c

限定符:对前面的字符或者字符串做限定说明

限定符

说明

*

某个字符之后加星号表示该字符不出现或出现多次

与星号相似,但略有变化,表示该字符出现一次或不出现

+

与星号相似,表示其前面字符出现一次或多次,但必须出现一次

{n,m}

某个字符之后出现,表示该字符最少n次,最多m次

{m}

正好出现了m次

测试案例

1)精确匹配 以a开头 c结尾 中间是有b或者没有b 长度不限的字符串
[root@www ~]# egrep "^ab*c$" file 
ac
abbc
abbbc
abbbbbc
abc
2)精确匹配 以a开头 c结尾 中间只出现一次b或者没有b的字符串
[root@www ~]# egrep "^ab?c$" file 
ac
abc
3)精确匹配 以a开头 c结尾 中间是有b且至少出现一次 长度不限的字符串
[root@www ~]# egrep "^ab+c$" file 
abbc
abbbc
abbbbbc
abc
4)精确匹配 以a开头 c结尾 中间是有b且至少出现两次最多出现四次 长度不限的字符串
[root@www ~]# egrep "^ab{2,4}c$" file 
abbc
abbbc
5)精确匹配 以a开头 c结尾 中间是有b且正好出现三次的字符串
[root@www ~]# egrep "^ab{3}c$" file 
abbbc
6) 精确匹配 以a开头 c结尾 中间是有b且至少出现一次的字符串
[root@www ~]# egrep "^ab{1,}c$" file 
abbc
abbbc
abbbbbc
abc

三、POSIX特殊字符

特殊字符

说明

[:alnum:]

匹配任意字母字符0-9 a-z A-Z

[:alpha:]

匹配任意字母,大写或小写

[:digit:]

数字 0-9

[:graph:]

非空字符( 非空格控制字符)

[:lower:]

小写字符a-z

[:upper:]

大写字符A-Z

[:cntrl:]

控制字符

[:print:]

非空字符( 包括空格)

[:punct:]

标点符号

[:blank:]

空格和TAB字符

[:xdigit:]

16 进制数字

[:space:]

所有空白字符( 新行、空格、制表符)

测试案例

注意[[ ]]  双中括号的意思:  第一个中括号是匹配符[] 匹配中括号中的任意一个字符,第二个[]是格式 如[:digit:]
1)精确匹配  以a开头c结尾  中间a-zA-Z0-9任意字符  长度为三个字节的字符串
[root@www ~]# egrep "^a[[:alnum:]]c$" file
acc
abc
aZc
a3c
2)精确匹配  以a开头c结尾  中间是a-zA-Z任意字符  长度为三个字节的字符串
[root@www ~]# egrep "^a[[:alpha:]]c$" file
acc
abc
aZc
3)精确匹配  以a开头c结尾  中间是0-9任意字符  长度为三个字节的字符串
[root@www ~]# egrep "^a[[:digit:]]c$" file
a3c
4)精确匹配  以a开头c结尾  中间是a-z任意字符  长度为三个字节的字符串
[root@www ~]# egrep "^a[[:lower:]]c$" file
acc
abc
4)精确匹配  以a开头c结尾  中间是A-Z任意字符  长度为三个字节的字符串
[root@www ~]# egrep "^a[[:upper:]]c$" file
aZc
5)精确匹配  以a开头c结尾  中间是非空任意字符  长度为三个字节的字符串
[root@www ~]# egrep "^a[[:print:]]c$" file
acc
abc
a_c
aZc
a c
a3c
6)精确匹配  以a开头c结尾  中间是符号字符  长度为三个字节的字符串
[root@www ~]# egrep "^a[[:punct:]]c$" file
a_c
7)精确匹配  以a开头c结尾  中间是空格或者TAB符字符  长度为三个字节的字符串
[root@www ~]# egrep "^a[[:blank:]]c$" file
a c
类似
[root@www ~]# egrep "^a[[:space:]]c$" file
a c
8)精确匹配  以a开头c结尾  中间是十六进制字符  长度为三个字节的字符串
[root@www ~]# egrep "^a[[:xdigit:]]c$" file
acc
abc
a3c

说明:特殊字符和POSIX字符是两套字符,都可以完成需要的匹配,大家学习的时候最少要记住一套字符并熟练应用。

job

案例一 匹配合法的IP地址

grep ‘^((25[0-5]|2[0-4][[:digit:]]|[01]?[[:digit:]][[:digit:]]?).){3}(25[0-5]|2[0-4][[:digit:]]|[01]?[[:digit:]][[:digit:]]?)$’ —color ip_base

案例二 匹配座机电话号码

egrep “^[[:graph:]]{12}$” number |egrep “^(0[1-9][0-9][0-9]?)-[1-9][0-9]{6,7}$”

最后更新于