12. 正则表达式

概述

Zabbix支持 Perl兼容正则表达式(PCRE, PCRE2)。

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

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

正则表达式

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

使用正则表达式时可能会耗尽堆栈。有关更多信息,请参见 pcrestack 帮助页

在多行匹配中,锚点 ^$ 分别匹配每行的开头/结尾,而不是整个字符串的开头/结尾。

全局正则表达式

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

一旦以这种方式创建了正则表达式,就可以在前端的多个位置通过引用其名称(以 @ 为前缀)使用它,例如 \@mycustomregexp

创建全局正则表达式:

  • 点击 Administration(管理) → General(一般)
  • 从下拉列表中选择 Regular expressions(正则表达式)
  • 点击 New regular expression(新建正则表达式)

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

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

参数 描述
Name(名字) 设置正则表达式名称。允许使用任何 Unicode 字符。
Expressions(表达式) 单击表达式块中的 Add(添加) 以添加新的子表达式。
Expression type(表达式类型) 选择表达式类型:
Character string included(包含字符串) - 匹配子字符串
Any character string included(包含任何字符串) - 匹配分隔列表中的任何子字符串。分隔列表包括逗号 (,)、点 (.)或正斜杠(/)。
Character string not included(不包含字符串) - 匹配除子字符串以外的任何字符串
Result is TRUE(结果为 TRUE) - 匹配正则表达式
Result is FALSE(结果为 FALSE) - 不匹配正则表达式
Expression(表达式) 输入子字符串/正则表达式。
Delimiter(分隔符) 逗号 (,)、点 (.) 或正斜杠 (/) 用于分隔正则表达式中的文本字符串。当选择“包含任意字符串”的表达式类型时,此参数才有效 。
Case sensitive(区分大小写) 一个复选框,用于指定正则表达式对大小写字母的敏感性。

表达式中的正斜杠 (/) 按字面意思处理,而不是分隔符。这样就可以保存包含斜杠的表达式而不会出错。

Zabbix 中的自定义正则表达式名称可能包含逗号、空格等。在那些可能导致引用时误解的情况下(例如,监控项键值参数中的逗号)整个引用可能会像这样放在引号中:"\@My custom regexp for purpose1, purpose2"。 正则表达式名称不得在其他位置引用(例如,在 LLD 规则属性中)。

测试 选项卡中,可以通过提供测试字符串来测试正则表达式及其子表达式。

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

总自定义表达式状态定义为组合结果。如果定义了多个子表达式,Zabbix 使用 AND 逻辑运算符计算 组合结果 。这意味着如果至少一个 Result 为 False,组合结果 也为 False 状态。

默认全局正则表达式

Zabbix在其默认数据集中提供了几个全局正则表达式。

名字 表达式 匹配结果
用于发现的文件系统 ^(btrfs\|ext2\|ext3\|ext4\|jfs\|reiser\|xfs\|ffs\|ufs\|jfs\|jfs2\|vxfs\|hfs\|refs\|apfs\|ntfs\|fat32\|zfs)$ "btrfs" 或 "ext2" 或 "ext3" 或 "ext4" 或 "jfs" 或 "reiser" 或 "xfs" 或 "ffs" 或 "ufs" 或 "jfs" 或 "jfs2" 或 "vxfs" 或 "hfs" 或 "refs" 或 "apfs" 或 "ntfs" 或 "fat32" 或 "zfs"
用于发现的网络接口 ^Software Loopback Interface 以 "Software Loopback Interface(软件环回接口)" 开头的字符串。
^lo$ "lo"
^(In)?[Ll]oop[Bb]ack[0-9._]*$ 以 "In" 为开头,接着是 "L" 或 "l",然后是 "oop",然后 "B" 或 "b",再然后 "ack" 组合的字符串。可以选择后跟任意数量的数字、点或下划线。
^NULL[0-9.]*$ 以 "NULL" 开头的后可选地跟任意数量的数字或点的字符串。
^[Ll]o[0-9.]*$ 以 "Lo" 或 "lo" 开头的后跟任意数量的数字或点的字符串。
^[Ss]ystem$ 匹配 "System" 或 "system"。
^Nu[0-9.]*$ 以 "Nu" 开头的后可选地跟任意数量的数字或点的字符串。
用于 SNMP 发现的存储设备 ^(Physical memory\|Virtual memory\|Memory buffers\|Cached memory\|Swap space)$ "Physical memory" 或 "Virtual memory" 或 "Memory buffers" 或 "Cached memory" 或 "Swap space"。
用于发现的 Windows 服务名称 ^(MMCSS\|gupdate\|SysmonLog\|clr_optimization_v2.0.50727_32\|clr_optimization_v4.0.30319_32)$ "MMCSS" 或 "gupdate" 或 "SysmonLog" 或类似于 "clr_optimization_v2.0.50727_32" 和 "clr_optimization_v4.0.30319_32" 的除了换行符之外可以放置​​任何字符代替点的字符串。
用于发现的 Windows 服务启动状态 ^(automatic\|automatic delayed)$ "automatic(自动)" 或 "automatic delayed(自动延迟)"。

示例

示例1

在低级别自动发现中使用下列表达式发现具有特定名称的数据库以外的数据库:

^TESTDATABASE$

regexp\_expr\_2.png

选择的 Expression type(表达式类型):“Result is FALSE(结果为假)”。 与名称不匹配,包含字符串 "TESTDATABASE"。

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

使用以下正则表达式,包括一个内联修饰符 (?i) 来匹配字符 "error":

(?i)error

regexp\_expr\_3a.png

选择的 Expression type(表达式类型):"Result is TRUE(结果为真)"。字符 "error" 被匹配。

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

使用以下包含多个内联修饰符的正则表达式来匹配特定行之后的字符:

(?<=match (?i)everything(?-i) after this line\n)(?sx).*# we add s modifier to allow . match newline characters

regexp\_expr\_4\_new.png

选择的表达式类型:"Result is TRUE(结果为真)"。匹配特定行之后的字符。

g 修饰符不能在行中指定。可用修饰符列表可以参考 pcresyntax 手册页。有关 PCRE 语法的更多信息,请参阅 PCRE HTML文档

支持正则表达式的位置

位置 < 正则表达式 全局正则表达式 多行匹配 注释
Agent 监控项 < < < < <
eventlog[] regexp, severity, source, eventid 参数
^ eventlog.count[] ^ ^ ^ regexp, severity, source, eventid 参数
^ log[] ^ ^ ^ regexp 参数
^ log.count[] ^ ^ ^ ^ ^
^ logrt[] ^ 是/否 ^ regexp 参数两者都支持,file_regexp 参数仅支持非全局表达式
^ logrt.count[] ^ ^ ^ ^
^ proc.cpu.util[] ^ cmdline 参数
^ proc.mem[] ^ ^ ^ ^
^ proc.num[] ^ ^ ^ ^
^ sensor[] ^ ^ ^ Linux 2.4的 devicesensor 参数
^ system.hw.macaddr[] ^ ^ ^ interface 参数
^ system.sw.packages[] ^ ^ ^ package 参数
^ vfs.dir.count[] ^ ^ ^ regex_incl, regex_excl, regex_excl_dir 参数
^ vfs.dir.size[] ^ ^ ^ regex_incl, regex_excl, regex_excl_dir 参数
^ vfs.file.regexp[] ^ ^ ^ regexp 参数
^ vfs.file.regmatch[] ^ ^ ^ ^
^ web.page.regexp[] ^ ^ ^ ^
SNMP traps < < < < <
< snmptrap[] regexp 参数
监控项值预处理 < pattern 参数
触发器函数/可计算监控项 < < < < <
< count() pattern 参数如果 operator 参数是 regexpiregexp
< countunique() ^ ^
< find() ^ ^
^ logeventid() pattern 参数
^ logsource() ^ ^ ^ ^
低级别自动发现 < < < < <
< Filters(过滤) 正则表达式 字段
^ Overrides(覆盖) ^ Operation(操作) 条件中 matches(匹配)does not match(不匹配) 选项
动作条件 < Host name(主机名) and Host metadata(主机元数据) 自动注册条件中 matches(匹配)does not match(不匹配) 选项
脚本 < 输入验证规则字段
Web 监控 < regex: 为前缀的变量
Required string(需要字符串) 字段
用户宏上下文 < 在宏的上下文中带有 regex: 前缀
宏函数 < < < < <
< regsub() pattern 参数
^ iregsub() ^ ^ ^ ^
图标映射 < Expression field
值映射 < Value(值) 字段如果值映射是regexp