12. 正则表达式

概述

Zabbix支持 Perl兼容的正规表达式库 (PCRE)。

在Zabbix中有两种使用正则表达式的方法:

  • 手动输入正则表达式
  • 使用在Zabbix中创建的全局正则表达式

正则表达式

你可以在支持的位置手动输入正则表达式。请注意,表达式可能不以@开头,因为该符号在Zabbix中用于引用全局正则表达式。

全局正则表达式

在Zabbix前端,有一个高级的编辑器用于创建和测试复杂的正则表达式。

一旦以这种方式创建了正则表达式,它就可以在前端的几个地方使用,方法是加个@前缀来引用它的名称, 例如,@mycustomregexp

创建全局正则表达式:

  • 点击: 管理 → 通用
  • 从右上角的下拉列表中选择 正则表达式
  • 单击 新的正则表达式

正则表达式选项卡允许设置正则表达式名称并添加子表达式。

所有必填输入字段都标有红色星号。

参数
名称 正则表达式名称。允许使用任何Unicode字符。
表达式 单击 达式块中的 添加 用来添加新的子表达式。
表达式类型 选择表达 类型:
字符串已包含 - 匹配子字符串
包括任何字符串 - 匹配分隔列表中的任何子字符串。分隔列表包括逗号(,)、点号(.)或正斜杠(/)。
字符串未包含 - 匹配除此以外的任何子字符串
结果为真 - 匹配正则表达式
结果为假 - 不匹配正则表达式
表达式 输入 字符串/正则表达式。
分隔符 用逗 (,)、点号(.)或正斜杠(/)分隔正则表达式中的文本字符串。仅当选择“包括任何字符串”表达式类型时,此参数才有效。
区分大小写 此复选框 于指定正则表达式是否对字母大小写敏感。

自Zabbix 2.4.0开始,表达式中的正斜杠(/)按字面意思处理,而不是分隔符。这样就可以保存包含斜杠的表达式,而以前版本则会报错。

<note important>Zabbix里自定义的表达式名称可以包含逗号,空格等。在引用时可能导致误解的情况下(例如,监控项键值的参数中的逗号),整个引用可以放在引号中,如下所示:// " @My custom regexp for purpose1, purpose2"//。
不能在其他位置引用正则表达式名称(例如,在低级自动发现规则属性中)。 :::

举例

在低级自动发现中使用以下正则表达式,来发现不考虑具有特定名称的数据库:

^TESTDATABASE$

regexp_expr_2.png

选择 表达式类型: "结果为假"。不匹配名称,包含字符串“TESTDATABASE”。

内联正则表达式修饰符的示例

使用如下带有内联修饰符(?i)的正则表达式匹配“error”字符:

(?i)error

regexp_expr_3a.png

选择 表达式类型: "结果为真"。“error”字符被匹配到。

内联正则表达式修饰符的另一个示例

使用如下带有内联修饰符(?i)的正则表达式匹配“error”字符:

(?<=match (?i)everything(?-i) after this line\n)(?sx).*    #我们增加了一个修饰符(?s)使得点号(.)可以匹配换行符

regexp_expr_4_new.png

选择表达式类型: "结果为真"。匹配特定行后的字符。

g修饰符不能在行中指定。可用的修饰符列表可以在 pcresyntax手册 里找到。如果想了解更多的PCRE正则表达式语法,请参考 PCRE HTML文档

更复杂的例子

自定义正则表达式可能包含多个子表达式,可以通过提供测试字符串在Test选项卡中进行测试。

结果显示每个子表达式的状态和整个自定义表达式的状态。

整个自定义表达式状态定义为 合并结果。如果定义了几个子表达式,Zabbix使用与逻辑运算符来计算 合并结果。这意味着如果只要有一个结果为False,合并结果 也为False状态。

全局正则表达式的说明

全局正则表达式 表达式 说明
文件系统发现 ^(bt|fs\|ext2\|ext3\|ext4\|jfs\|reiser\|xfs\|ffs\|ufs\|jfs\|jfs2\|vxfs\|hfs\|refs\|ntfs\|fat32\|zfs)$ 匹配btr s”或“ext2”或“ext3”或“ext4”或“jfs”或“reiser”或“xfs”或“ffs”或“ufs”或“jfs”或“jfs2”或“vxfs”或“hfs“或”refs“或”ntfs“或”fat32“或”zfs“
网络接口发现 ^Sof|ware Loopback Interface 匹配以"S ftware Loopback Interface"开头的字符串
^lo$ 匹配"lo"
^(In)?[Ll]oop[Bb]ack[0-9._]*$ 匹配以 “In” 开头(该项可选),然后是“L”或者“l”字符,然后是“oop”,然后是“B”或者“b”,然后是“ack”,最后以任意长度(长度可能为0)的数字(0-9),点号(.)或者下划线(_)结尾的字符串
^NULL[0-9.]*$ 匹配以“NULL”开头的字符串,后面是任意长度(长度可能为0)的数字(0-9)或者点号(.)
^[Ll]o[0-9.]*$ 匹配以“Lo”或者“lo”开头的字符串,后面是任意长度(长度可能为0)的数字(0-9)或者点号(.)
^[Ss]ystem$ 匹配“System”或者“system”
^Nu[0-9.]*$ 匹配以 “Nu” 开头的字符串,后面是任意长度(长度可能为0)的数字(0-9)或者点号(.)
存储设备SNMP发现 ^(Ph|sical memory\|Virtual memory\|Memory buffers\|Cached memory\|Swap space)$ 匹配"Ph sical memory"或"Virtual memory"或"Memory buffers"或"Cached memory"或"Swap space"
Windows服务名称发现 ^(MM|SS\|gupdate\|SysmonLog\|clr_optimization_v2.0.50727_32\|clr_optimization_v4.0.30319_32)$ 匹配“MM SS”或“gupdate”或“SysmonLog”或类似“clr_optimization_v2.0.50727_32”和“clr_optimization_v4.0.30319_32”的字符串,而不是点号,可以放置除换行符之外的任何字符。
Windows服务启动状态发现 ^(auto|atic\|automatic delayed)$ 匹配"auto atic"或"automatic delayed"。

支持正则表达式的位置

位置 表达式 全局正则表达 注释
Agent监控项
eventlog[] 支持 支 re|exp, severity, source, eventid 参数
log[] regexp 参数
log.count[]
logrt[] 支持/不支持 reg|xp 参数两者都支持, file_regexp 参数仅支持非全局表达式
logrt.count[]
proc.cpu.util[] 不支持 c|dline 参数
proc.mem[]
proc.num[]
sensor[] devicesensor 参数在Linux 2.4中
system.hw.macaddr[] interface 参数
system.sw.packages[] package 参数
vfs.dir.count[] regex_inclregex_excl 参数
vfs.dir.size[] regex_inclregex_excl 参数
vfs.file.regexp[] regexp 参数
vfs.file.regmatch[]
web.page.regexp[]
SNMP捕捉器
snmptrap[] 支持 支 re|exp 参数
监控项值预处理 支持 不支持 pattern
触发器函数
count() 支持 支 pa|tern 参数,如果 operator 参数是 regexp 或者 iregexp
logeventid() pattern 参数
iregexp()
regexp()
低级别发现 支持 支持 过滤 字段
Web监测 不支持 *Varia les* 带有 regex: 前缀
变量所需字符串 字段
宏函数
regsub() 支持 不 pat|ern 参数
iregsub()
图标映射 支持 支持 表达式