处理海量日志对每一个运维来说都非常的头疼,日志分析我们首先需要把需要的数据从海量的日志中匹配出来,降低数据量,然后在分析这些日志。那么从海量的日志中把我们需要的日志找出来就需要我们写一个公式来匹配,那么如何才能写一个这样的公式呢?
这节课我就给大家说说正则表达式,看起来比较高大上,其实就是通过给定的符号生成一个字符串匹配的公式,通过该公式把需要的数据匹配出来。
比如

  • 匹配正确的IP地址
  • 匹配正确的e-mail地址

    正则表达式

    1、正则表达式介绍

    正则表达式(Regular Expression、regex或regexp,缩写为RE),也译为正规表示法、常规表示法,是一种字符模式,用于在查找过程中匹配指定的字符。
    许多程序设计语言都支持利用正则表达式进行字符串操作。例如,在Perl中就内建了一个功能强大的正则表达式引擎。
    正则表达式这个概念最初是由Unix中的工具软件(例如sed和grep)普及开的。
    支持正则表达式的程序如:locate |find| vim| grep| sed |awk
    正则表达式是一个三方产品,被常用计算机语言广泛使用,比如:shell、PHP、python、java、js等!
  1. [root@manage01 ~]# locate sko
  2. locate: 无法执行 stat () `/var/lib/mlocate/mlocate.db': 没有那个文件或目录
  3. 使用updatedb生成数据文件
  4. [root@manage01 ~]# updatedb

2、正则表达式特殊字符

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

定位符 说明
^ 锚定开头 ^a 以a开头 默认锚定一个字符
$ 锚定结尾 a$ 以a结尾 默认锚定一个字符

测试案例

  1. 1)精确匹配 a开头c结尾的字符串
  2. [root@zutuanxue ~]# egrep "^ac$" file
  3. ac
  4. 2)模糊匹配 a开头
  5. [root@zutuanxue ~]# egrep "^a" file
  6. ac
  7. ab
  8. abbc
  9. abcc
  10. aabbcc
  11. abbbc
  12. abbbbbc
  13. acc
  14. abc
  15. asb
  16. aa
  17. a_c
  18. aZc
  19. aAAAAc
  20. a c
  21. abababab
  22. a3c
  23. 3)模糊匹配 c结尾的字符串
  24. [root@zutuanxue ~]# egrep "c$" file
  25. ac
  26. abbc
  27. abcc
  28. aabbcc
  29. abbbc
  30. abbbbbc
  31. acc
  32. abc
  33. a_c
  34. aZc
  35. aAAAAc
  36. a c
  37. ccc
  38. a3c

匹配符:匹配字符串

匹配符 说明
. 匹配除回车以外的任意一个
字符
( ) 字符串分组
[ ] 定义字符类,匹配括号中的一个
字符
[ ^ ] 表示否定括号中出现字符类中的字符,取反
\ 转义字符
|

测试案例

  1. 1)精确匹配 a开头c结尾 中间任意 长度为三个字节的字符串
  2. [root@zutuanxue ~]# egrep "^a.c$" file
  3. acc
  4. abc
  5. a_c
  6. aZc
  7. a c
  8. a3c
  9. 2)模糊匹配 cc结尾的字符串 因为$只能锚定单个字符,如果是一个字符串就需要用()来做定义
  10. [root@zutuanxue ~]# egrep "(cc)$" file
  11. abcc
  12. aabbcc
  13. acc
  14. ccc
  15. 3)精确匹配 a开头c结尾 中间是a-z,0-9 长度为三个字节的字符串
  16. [root@zutuanxue ~]# egrep "^a[a-z0-9]c$" file
  17. acc
  18. abc
  19. a3c
  20. 4)精确匹配 a开头c结尾 中间不包含a-z,0-9 长度为三个字节的字符串
  21. [root@zutuanxue ~]# egrep "^a[^a-z0-9]c$" file
  22. a_c
  23. aZc
  24. a c
  25. 5)精确匹配 e开头f结尾 中间是*号 长度为三个字节的字符串 e*f
  26. [root@zutuanxue ~]# egrep "^e\*f$" file
  27. e*f
  28. 6)精确匹配 a开头bc结尾 中间是任意 长度为三个字节的字符串
  29. [root@zutuanxue ~]# egrep "^a.(b|c)$" file
  30. acc
  31. abc
  32. asb
  33. a_c
  34. aZc
  35. a c
  36. a3c

限定符:对前面的字符或者(字符串)出现的次数做限定说明

限定符 说明
* 某个字符之后加星号表示该字符不出现或出现多次 a (ab)
与星号相似,但略有变化,表示该字符出现一次或不出现
+ 与星号相似,表示其前面字符出现一次或多次,但必须出现一次
{n,m} 某个字符之后出现,表示该字符最少n次,最多m次
{m} 正好出现了m次

测试案例

  1. 1)精确匹配 a开头 c结尾 中间是有b或者没有b 长度不限的字符串
  2. [root@zutuanxue ~]# egrep "^ab*c$" file
  3. ac
  4. abbc
  5. abbbc
  6. abbbbbc
  7. abc
  8. 2)精确匹配 a开头 c结尾 中间只出现一次b或者没有b的字符串
  9. [root@zutuanxue ~]# egrep "^ab?c$" file
  10. ac
  11. abc
  12. 3)精确匹配 a开头 c结尾 中间是有b且至少出现一次 长度不限的字符串
  13. [root@zutuanxue ~]# egrep "^ab+c$" file
  14. abbc
  15. abbbc
  16. abbbbbc
  17. abc
  18. 4)精确匹配 a开头 c结尾 中间是有b且至少出现两次最多出现四次 长度不限的字符串
  19. [root@zutuanxue ~]# egrep "^ab{2,4}c$" file
  20. abbc
  21. abbbc
  22. 5)精确匹配 a开头 c结尾 中间是有b且正好出现三次的字符串
  23. [root@zutuanxue ~]# egrep "^ab{3}c$" file
  24. abbbc
  25. 6) 精确匹配 a开头 c结尾 中间是有b且至少出现一次的字符串
  26. [root@zutuanxue ~]# egrep "^ab{1,}c$" file
  27. abbc
  28. abbbc
  29. abbbbbc
  30. 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:] 所有空白字符( 新行、空格、制表符)

测试案例

  1. 注意[[ ]] 双中括号的意思: 第一个中括号是匹配符[] 匹配中括号中的任意一个字符,第二个[]是格式 如[:digit:]
  2. 1)精确匹配 a开头c结尾 中间a-zA-Z0-9任意字符 长度为三个字节的字符串
  3. [root@zutuanxue ~]# egrep "^a[[:alnum:]]c$" file
  4. acc
  5. abc
  6. aZc
  7. a3c
  8. 2)精确匹配 a开头c结尾 中间是a-zA-Z任意字符 长度为三个字节的字符串
  9. [root@zutuanxue ~]# egrep "^a[[:alpha:]]c$" file
  10. acc
  11. abc
  12. aZc
  13. 3)精确匹配 a开头c结尾 中间是0-9任意字符 长度为三个字节的字符串
  14. [root@zutuanxue ~]# egrep "^a[[:digit:]]c$" file
  15. a3c
  16. 4)精确匹配 a开头c结尾 中间是a-z任意字符 长度为三个字节的字符串
  17. [root@zutuanxue ~]# egrep "^a[[:lower:]]c$" file
  18. acc
  19. abc
  20. 4)精确匹配 a开头c结尾 中间是A-Z任意字符 长度为三个字节的字符串
  21. [root@zutuanxue ~]# egrep "^a[[:upper:]]c$" file
  22. aZc
  23. 5)精确匹配 a开头c结尾 中间是非空任意字符 长度为三个字节的字符串
  24. [root@zutuanxue ~]# egrep "^a[[:print:]]c$" file
  25. acc
  26. abc
  27. a_c
  28. aZc
  29. a c
  30. a3c
  31. 6)精确匹配 a开头c结尾 中间是符号字符 长度为三个字节的字符串
  32. [root@zutuanxue ~]# egrep "^a[[:punct:]]c$" file
  33. a_c
  34. 7)精确匹配 a开头c结尾 中间是空格或者TAB符字符 长度为三个字节的字符串
  35. [root@zutuanxue ~]# egrep "^a[[:blank:]]c$" file
  36. a c
  37. 类似
  38. [root@zutuanxue ~]# egrep "^a[[:space:]]c$" file
  39. a c
  40. 8)精确匹配 a开头c结尾 中间是十六进制字符 长度为三个字节的字符串
  41. [root@zutuanxue ~]# egrep "^a[[:xdigit:]]c$" file
  42. acc
  43. abc
  44. a3c

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

4、练习案例

  1. 1IP匹配公式
  2. 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
  3. 2E-MAIL地址匹配公式