共计 3579 个字符,预计需要花费 9 分钟才能阅读完成。
处理海量日志对每一个运维来说都非常的头疼,日志分析我们首先需要把需要的数据从海量的日志中匹配出来,降低数据量,然后在分析这些日志。那么从海量的日志中把我们需要的日志找出来就需要我们写一个公式来匹配,那么如何才能写一个这样的公式呢?
这节课我就给大家说说正则表达式,看起来比较高大上,其实就是通过给定的符号生成一个字符串匹配的公式,通过该公式把需要的数据匹配出来。
比如
- 匹配正确的 IP 地址
- 匹配正确的 e -mail 地址
正则表达式
1、正则表达式介绍
正则表达式(Regular Expression、regex 或 regexp,缩写为 RE),也译为正规表示法、常规表示法,是一种字符模式,用于在查找过程中匹配指定的字符。
许多程序设计语言都支持利用正则表达式进行 字符串操作。例如,在 Perl 中就内建了一个功能强大的正则表达式引擎。
正则表达式这个概念最初是由 Unix 中的工具软件(例如 sed 和 grep)普及开的。
支持正则表达式的程序如:locate |find| vim| grep| sed |awk
正则表达式是一个三方产品,被常用计算机语言广泛使用,比如:shell、PHP、python、java、js 等!
[root@manage01 ~]# locate sko
locate: 无法执行 stat () `/var/lib/mlocate/mlocate.db': 没有那个文件或目录
使用 updatedb 生成数据文件
[root@manage01 ~]# updatedb
2、正则表达式特殊字符
定位符使用技巧:同时锚定开头和结尾,做精确匹配;单一锚定开头或结尾或者不锚定的,做模糊匹配。
定位符 | 说明 |
---|---|
^ | 锚定开头 ^a 以 a 开头 默认锚定一个字符 |
$ | 锚定结尾 a$ 以 a 结尾 默认锚定一个字符 |
测试案例
1)精确匹配 以 a 开头 c 结尾的字符串
[root@zutuanxue ~]# egrep "^ac$" file
ac
2)模糊匹配 以 a 开头
[root@zutuanxue ~]# 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@zutuanxue ~]# egrep "c$" file
ac
abbc
abcc
aabbcc
abbbc
abbbbbc
acc
abc
a_c
aZc
aAAAAc
a c
ccc
a3c
匹配符: 匹配字符串
匹配符 | 说明 | |
---|---|---|
. | 匹配除回车以外的任意 一个 字符 | |
() | 字符串分组 | |
[] | 定义字符类,匹配括号中的 一个 字符 | |
[^] | 表示否定括号中出现字符类中的字符,取反。 | |
\ | 转义字符 | |
| | 或 |
测试案例
1)精确匹配 以 a 开头 c 结尾 中间任意 长度为三个字节的字符串
[root@zutuanxue ~]# egrep "^a.c$" file
acc
abc
a_c
aZc
a c
a3c
2)模糊匹配 以 cc 结尾的字符串 因为 $ 只能锚定单个字符,如果是一个字符串就需要用 () 来做定义
[root@zutuanxue ~]# egrep "(cc)$" file
abcc
aabbcc
acc
ccc
3)精确匹配 以 a 开头 c 结尾 中间是 a -z,0-9 长度为三个字节的字符串
[root@zutuanxue ~]# egrep "^a[a-z0-9]c$" file
acc
abc
a3c
4)精确匹配 以 a 开头 c 结尾 中间不包含 a -z,0-9 长度为三个字节的字符串
[root@zutuanxue ~]# egrep "^a[^a-z0-9]c$" file
a_c
aZc
a c
5)精确匹配 以 e 开头 f 结尾 中间是 * 号 长度为三个字节的字符串 e*f
[root@zutuanxue ~]# egrep "^e\*f$" file
e*f
6)精确匹配 以 a 开头 b 或 c 结尾 中间是任意 长度为三个字节的字符串
[root@zutuanxue ~]# egrep "^a.(b|c)$" file
acc
abc
asb
a_c
aZc
a c
a3c
限定符: 对前面的字符或者 (字符串) 出现的次数 做限定说明
限定符 | 说明 |
---|---|
* | 某个字符之后加星号表示该字符不出现或出现多次 a* (ab)* |
? | 与星号相似,但略有变化,表示该字符出现一次或不出现 |
+ | 与星号相似,表示其前面字符出现一次或多次,但必须出现一次 |
{n,m} | 某个字符之后出现,表示该字符最少 n 次,最多 m 次 |
{m} | 正好出现了 m 次 |
测试案例
1)精确匹配 以 a 开头 c 结尾 中间是有 b 或者没有 b 长度不限的字符串
[root@zutuanxue ~]# egrep "^ab*c$" file
ac
abbc
abbbc
abbbbbc
abc
2)精确匹配 以 a 开头 c 结尾 中间只出现一次 b 或者没有 b 的字符串
[root@zutuanxue ~]# egrep "^ab?c$" file
ac
abc
3)精确匹配 以 a 开头 c 结尾 中间是有 b 且至少出现一次 长度不限的字符串
[root@zutuanxue ~]# egrep "^ab+c$" file
abbc
abbbc
abbbbbc
abc
4)精确匹配 以 a 开头 c 结尾 中间是有 b 且至少出现两次最多出现四次 长度不限的字符串
[root@zutuanxue ~]# egrep "^ab{2,4}c$" file
abbc
abbbc
5)精确匹配 以 a 开头 c 结尾 中间是有 b 且正好出现三次的字符串
[root@zutuanxue ~]# egrep "^ab{3}c$" file
abbbc
6) 精确匹配 以 a 开头 c 结尾 中间是有 b 且至少出现一次的字符串
[root@zutuanxue ~]# egrep "^ab{1,}c$" file
abbc
abbbc
abbbbbc
abc
3、正则表达式 POSIX 字符
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@zutuanxue ~]# egrep "^a[[:alnum:]]c$" file
acc
abc
aZc
a3c
2)精确匹配 以 a 开头 c 结尾 中间是 a -zA- Z 任意字符 长度为三个字节的字符串
[root@zutuanxue ~]# egrep "^a[[:alpha:]]c$" file
acc
abc
aZc
3)精确匹配 以 a 开头 c 结尾 中间是 0-9 任意字符 长度为三个字节的字符串
[root@zutuanxue ~]# egrep "^a[[:digit:]]c$" file
a3c
4)精确匹配 以 a 开头 c 结尾 中间是 a - z 任意字符 长度为三个字节的字符串
[root@zutuanxue ~]# egrep "^a[[:lower:]]c$" file
acc
abc
4)精确匹配 以 a 开头 c 结尾 中间是 A - Z 任意字符 长度为三个字节的字符串
[root@zutuanxue ~]# egrep "^a[[:upper:]]c$" file
aZc
5)精确匹配 以 a 开头 c 结尾 中间是非空任意字符 长度为三个字节的字符串
[root@zutuanxue ~]# egrep "^a[[:print:]]c$" file
acc
abc
a_c
aZc
a c
a3c
6)精确匹配 以 a 开头 c 结尾 中间是符号字符 长度为三个字节的字符串
[root@zutuanxue ~]# egrep "^a[[:punct:]]c$" file
a_c
7)精确匹配 以 a 开头 c 结尾 中间是空格或者 TAB 符字符 长度为三个字节的字符串
[root@zutuanxue ~]# egrep "^a[[:blank:]]c$" file
a c
类似
[root@zutuanxue ~]# egrep "^a[[:space:]]c$" file
a c
8)精确匹配 以 a 开头 c 结尾 中间是十六进制字符 长度为三个字节的字符串
[root@zutuanxue ~]# egrep "^a[[:xdigit:]]c$" file
acc
abc
a3c
说明:特殊字符和 POSIX 字符是两套字符,都可以完成需要的匹配,大家学习的时候最少要记住一套字符并熟练应用。
4、练习案例
1、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
2、E-MAIL 地址匹配公式
正文完
星哥玩云-微信公众号