阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

正则表达式

225次阅读
没有评论

共计 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 地址匹配公式

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-06-09发表,共计3579字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中