Loading... 处理海量日志对每一个运维来说都非常的头疼,日志分析我们首先需要把需要的数据从海量的日志中匹配出来,降低数据量,然后在分析这些日志。那么从海量的日志中把我们需要的日志找出来就需要我们写一个公式来匹配,那么如何才能写一个这样的公式呢? 这节课我就给大家说说正则表达式,看起来比较高大上,其实就是通过给定的符号生成一个字符串匹配的公式,通过该公式把需要的数据匹配出来。 比如 * 匹配正确的IP地址 * 匹配正确的e-mail地址 ## 正则表达式 ### 1、正则表达式介绍 **正则表达式** (Regular Expression、regex或regexp,缩写为RE),也译为正规表示法、常规表示法,是一种字符模式,用于在查找过程中匹配指定的字符。 许多程序设计语言都支持利用正则表达式进行**字符串操作** 。例如,在Perl中就内建了一个功能强大的正则表达式引擎。 正则表达式这个概念最初是由Unix中的工具软件(例如sed和grep)普及开的。 **支持正则表达式的程序如:locate |find| vim| grep| sed |awk** **正则表达式是一个三方产品,被常用计算机语言广泛使用,比如:shell、PHP、python、java、js等!** ```bash [root@manage01 ~]# locate sko locate: 无法执行 stat () `/var/lib/mlocate/mlocate.db': 没有那个文件或目录 使用updatedb生成数据文件 [root@manage01 ~]# updatedb ``` ### 2、正则表达式特殊字符 **定位符使用技巧:同时锚定开头和结尾,做精确匹配;单一锚定开头或结尾或者不锚定的,做模糊匹配。** | 定位符 | 说明 | | ------ | ------------------------------------ | | ^ | 锚定开头 ^a 以a开头 默认锚定一个字符 | | $ | 锚定结尾 a$ 以a结尾 默认锚定一个字符 | 测试案例 ```bash 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 ``` 匹配符:匹配字符串 | 匹配符 | 说明 | | ------ | ------------------------------------------ | | . | 匹配除回车以外的任意**一个**字符 | | ( ) | 字符串分组 | | [ ] | 定义字符类,匹配括号中的**一个**字符 | | [ ^ ] | 表示否定括号中出现字符类的字符,**取反**。 | | \\ | 转义字符 | | \| | 或 | 测试案例 ```bash 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次 | 测试案例 ```bash 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 ``` 最后修改:2023 年 09 月 28 日 © 转载自他站 打赏 赞赏作者 支付宝微信 赞 如果觉得我的文章对你有用,请随意赞赏