处理海量日志对每一个运维来说都非常的头疼,日志分析我们首先需要把需要的数据从海量的日志中匹配出来,降低数据量,然后在分析这些日志。那么从海量的日志中把我们需要的日志找出来就需要我们写一个公式来匹配,那么如何才能写一个这样的公式呢?
正则表达式介绍
正则表达式,也译为正规表示法、常规表示法,是一种字符模式,用于在查找过程中匹配指定的字符。
许多程序设计语言都支持利用正则表达式进行字符串操作。
- 支持正则表达式的程序如:locate |find| vim| grep| sed |awk
- 正则表达式是一个三方产品,被常用计算机语言广泛使用,比如:shell、PHP、python、java、js等!
正则表达式特殊字符
- 定位符使用技巧:同时锚定开头和结尾,做精确匹配;单一锚定开头或结尾或者不锚定的,做模糊匹配。
- 测试案例
1)精确匹配 以a开头c结尾的字符串
2)模糊匹配 以a开头
3)模糊匹配 以c结尾的字符串
- 匹配符:匹配字符串
- 测试案例
1)精确匹配 以a开头c结尾 中间任意 长度为三个字节的字符串
2)模糊匹配 以cc结尾的字符串 因为$只能锚定单个字符,如果是一个字符串就需要用()来做定义
3)精确匹配 以a开头c结尾 中间是a-z,0-9 长度为三个字节的字符串
4)精确匹配 以a开头c结尾 中间不包含a-z,0-9 长度为三个字节的字符串
5)精确匹配 以e开头f结尾 中间是号 长度为三个字节的字符串 ef
6)精确匹配 以a开头b或c结尾 中间是任意 长度为三个字节的字符串
- 限定符:对前面的字符或者(字符串)出现的次数做限定说明
- 测试案例
1)精确匹配 以a开头 c结尾 中间是有b或者没有b 长度不限的字符串
2)精确匹配 以a开头 c结尾 中间只出现一次b或者没有b的字符串
3)精确匹配 以a开头 c结尾 中间是有b且至少出现一次 长度不限的字符串
4)精确匹配 以a开头 c结尾 中间是有b且至少出现两次最多出现四次 长度不限的字符串
5)精确匹配 以a开头 c结尾 中间是有b且正好出现三次的字符串
6) 精确匹配 以a开头 c结尾 中间是有b且至少出现一次的字符串
正则表达式POSIX字符
posix字符一次只匹配一个范围中的一个字节
- 测试案例
注意[[ ]] 双中括号的意思: 第一个中括号是匹配符[] 匹配中括号中的任意一个字符,第二个[]是格式 如[:digit:]
1)精确匹配 以a开头c结尾 中间a-zA-Z0-9任意字符 长度为三个字节的字符串
2)精确匹配 以a开头c结尾 中间是a-zA-Z任意字符 长度为三个字节的字符串
3)精确匹配 以a开头c结尾 中间是0-9任意字符 长度为三个字节的字符串
4)精确匹配 以a开头c结尾 中间是a-z任意字符 长度为三个字节的字符串
4)精确匹配 以a开头c结尾 中间是A-Z任意字符 长度为三个字节的字符串
5)精确匹配 以a开头c结尾 中间是非空任意字符 长度为三个字节的字符串
6)精确匹配 以a开头c结尾 中间是符号字符 长度为三个字节的字符串
7)精确匹配 以a开头c结尾 中间是空格或者TAB符字符 长度为三个字节的字符串
8)精确匹配 以a开头c结尾 中间是十六进制字符 长度为三个字节的字符串
- 匹配正确的的IP地址:
egrep ‘^((25[0-5]|2[0-4][[:digit:]]|[01]?[[:digit:]][[:digit:]]?).){3}(25[0-5]|2[0-4][[:digit:]]|[01]?[[:digit:]][[:digit:]]?)$’ --color ip_base