文章目录
- 一、正则表达式介绍
- 二、特殊字符
- 1、定位符
- 2、匹配符
- 3、限定符
- 三、POSIX字符
一、正则表达式介绍
正则表达式(Regular Expression)是一种文本模式匹配,包括普通字符(例如,a - z 之间的字母)和特殊字符(称为"元字符")。就像数学公式一样,我们可以通过正则表达式,在海量的数据中获取我们自己想要的数据。
正则表达式,常被计算机语言广泛使用,比如:shell、php、python、java、js等!
shell也支持正则表达式,但不是所有命令都支持,常见的命令只有 awk、grep、sed命令。
# 测试数据:
ac
ab
abbc
abcc
abbbbc
acc
abc
asb
aa
cc
a_c
aZc
aAAAAc
a c
ABC
ccc
dddd
http:www
abababab
c c d
123
a3c
e*f
二、特殊字符
1、定位符
定位符使用技巧:字符 ^ 和 $ 同时使用时,表示精确匹配,只是用字符$或^ 表示模糊匹配!
定位符 | 说明 |
^ | 锚定开头 如:^a 匹配以a开头 默认锚定一个字符 |
$ | 锚定结尾 如:a$ 匹配以a结尾 默认锚定一个字符 |
< 或 \b | 词首锚定,用于单词模式的左侧 |
> 或 \b | 词尾锚定,用于单词模式的右侧 |
<PATTERN> | 匹配完整单词 |
去除nginx配置文件空行
[root@shell zz]# egrep -v "^$" /usr/local/nginx/conf/nginx.conf
去除nginx配置文件空行和#
[root@shell zz]# egrep "^$|#" /usr/local/nginx/conf/nginx.conf
演示:
# 1、精确匹配 以a开头c结尾的字符
[root@shell zz]# grep -e "^ac$" test.txt
ac
# 2、模糊匹配 以a开头字符
[root@shell zz]# grep -e "^a" test.txt
ac
ab
abbc
abcc
abbbbc
acc
abc
asb
aa
a_c
aZc
aAAAAc
a c
abababab
a3c
a*c
2、匹配符
匹配符 | 说明 |
. | 匹配除回车以外任意字符 |
() | 字符串分组 |
[] | 表示匹配括号中的一个字符 |
[^] | 取反,表示不匹配括号中出现的字符 |
\ | 转义字符 |
| | 或 |
演示:
# 1、匹配a开头c结尾 中间是任意一个字符
[root@shell zz]# grep -e "^a.c$" test.txt
acc
abc
a_c
aZc
a c
a3c
# 2、匹配a开头c结尾 中间是a、b、c中的任意一个字符
[root@shell zz]# grep "^a[abc]c$" test.txt
acc
abc
# 3、匹配a开头c结尾 中间字符不包括a、b、c字符
[root@shell zz]# grep "^a[^abc]c$" test.txt
a_c
aZc
a c
a3c
# 4、匹配"e*f" *号在正则又特殊意义 需要使用\转义字符进行转义
[root@shell zz]# grep -e "e\*f" test.txt
# 5、匹配a或b开头的字符
[root@shell zz]# egrep "^a|^b" test.txt
ac
ab
abbc
abcc
abbbbc
acc
abc
asb
aa
a_c
aZc
aAAAAc
a c
abababab
a3c
bfsda
# 6、匹配a或b开头的字符 使用小括号分组
[root@shell zz]# egrep "^(a|b)" test.txt
ac
ab
abbc
abcc
abbbbc
acc
abc
asb
aa
a_c
aZc
aAAAAc
a c
abababab
a3c
bfsda
# 注意 5和6使用grep命令需要使用转义符进行转义 如下:
grep -e "^\(a\|b\)" test.txt
grep -e "^a\|^b" test.txt
3、限定符
对前面的字符或者字符串做限定说明
限定符 | 说明 |
* | 匹配前面的字符0次或任意次 |
\? | 匹配前面的字符0次或一次,意味着可有可无 |
+ | 匹配前面的字符1次或任意次,意味着至少一次 |
{n,m} | 匹配某个字符出现次数 表示最少n次,最多m次 |
{n} | 匹配某个字符正好出现n次 |
{0,n} | 匹配前面的字符至多n次 |
{m,} | 至少m次 |
演示:
# 1、匹配a开头c结尾 中间b可有可无
[root@shell zz]# egrep "^ab*c$" test.txt
ac
abbc
abbbbc
abc
# 2、匹配a开头c结尾 中间b只能出现一次,或者一次也不出现
[root@shell zz]# egrep "^ab?c$" test.txt
ac
abc
# 3、匹配a开头c结尾 中间b至少出现一次,或多次
[root@shell zz]# egrep "^ab+c$" test.txt
abbc
abbbbc
abc
# 4、匹配a开头c结尾 中间b正好出现2次
[root@shell zz]# egrep "^ab{2}c$" test.txt
abbc
# 5、匹配a开头c结尾 中间b最少出现2次,最多出现5次
[root@shell zz]# egrep "^ab{2,5}c$" test.txt
abbc
abbbbc
三、POSIX字符
特殊字符 | 说明 |
[[:alnum:]] | 匹配任意字母字符0-9 a-z A-Z(不包括符号类型的) |
[[:alpha:]] | 匹配任意字母 大写或小写 |
[[:digit:]] | 匹配数字0-9 |
[[:graph:]] | 匹配非空字符(非空格 控制字符) |
[[:print:]] | 匹配非空字符 |
[[:upper:]] | 匹配大写 |
[[:lower:]] | 匹配小写 |
[[:cntrl:]] | 匹配控制字符(如:tab) |
[[:punct:]] | 匹配标点符号 |
[[:blank:]] | 匹配空格和tab键 |
[[:xdigit:]] | 16进制数字 |
[[:space:]] | 所有空白字符(新行、空格、制表符) |
注意[ [ ] ]双括号地意思:第一个中括号是匹配符[] 表示匹配括号中任意一个字符,第二个[]是POSIX字符的固定格式
随机演示:
# 1、匹配任意字母字符
egrep "[[:alnum:]]" test.txt
# 2、匹配任意字母 大写或小写
egrep "[[:alpha:]]" test.txt
# 3、匹配a开头c结尾中间是数字的
egrep "^a[[:digit:]].*c$" test
# 4、匹配非空字符(不匹配空格)
egrep -v "[[:graph:]]" test.txt