12. 正则表达式
概述
Zabbix支持 Perl Compatible Regular Expressions (PCRE)。
在Zabbix中有两种使用正则表达式的方法:
手动输入正则表达式
使用在Zabbix中创建的全局正则表达式
正则表达式
可以在支持的位置手动输入正则表达式。请注意,表达式可能不以@开头,因为该符号在Zabbix中用于引用全局正则表达式。
全局正则表达式
在Zabbix前端,有一个高级的编辑器用于创建和测试复杂的正则表达式。
一旦以这种方式创建了正则表达式,它就可以在前端的几个地方使用,方法是加个@前缀来引用它的名称,例如,@mycustomregexp。
要创建全局正则表达式:
切换到: 管理(Administration) → 一般(General)
从右上角的下拉列表中选择 正则表达式(Regular expressions)
单击 新的正则表达式(New regular expression)
正则表达式(Regular expressions)选项卡允许设置正则表达式名称并添加子表达式。
所有必填输入字段都标有红色星号。
参数 | 说明 | |
---|---|---|
名称(Name) | 设置正则表达式名称。 允许使用任何Unicode字符。 | |
表达式(Expressions) | 单击表达式块中的 添加(Add) 以添加新的子表达式。 | |
表达式类型(Expression type) | 选择表达式类型: 字符串已包含(Character string included) - 匹配子符子串 包括任何字符串(Any character string included) - 匹配列表里包含的字符子串。匹配分隔列表中的任何子字符串。分隔列表包括逗号(,),点号(.)或正斜杠(/)。 字符串未包含(Character string not included) - 匹配除此以外的任何字符串 结果为真(Result is TRUE) - 匹配正则表达式 结果为假(Result is FALSE) - 不匹配正则表达式 | |
表达式(Expression) | 输入子字符串/正则表达式。 | |
分隔符(Delimiter) | 用逗号(,),点号(.)或正斜杠(/)分隔正则表达式中的文本字符串。仅当选择”包括任何字符串(Any character string included)“表达式类型时,此参数才有效。 | |
区分大小写(Case sensitive) | 此复选框用于指定正则表达式是否对字母大小写敏感。 |
从Zabbix 2.4.0开始,表达式中的正斜杠(/)按字面意思处理,而不是分隔符。这样就可以保存包含斜杠的表达式,而以前会产生错误。
Zabbix里自定义的表达式名称可以包含逗号,空格等。在引用时可能导致误解的情况下(例如,监控项键的参数中的逗号),整个引用可以放在引号中,如下所示: “ @My custom regexp for purpose1, purpose2”。
不能在其他位置引用正则表达式名称(例如,在LLD规则属性中)。
举例
在LLD中使用以下正则表达式来发现不考虑具有特定名称的数据库的数据库:
^TESTDATABASE$
选择 表达式类型(Expression type): “结果为假(Result is FALSE)”。不匹配名称,包含字符串“TESTDATABASE”。
内联正则表达式修饰符的示例
使用如下带有内联修饰符(?i)的正则表达式匹配“error”字符:
(?i)error
选择 表达式类型(Expression type): “结果为真(Result is TRUE)”。“error”字符被匹配到。
内联正则表达式修饰符的另一个示例
使用以下正则表达式(包括多个内联修饰符)来匹配特定行之后的字符:
(?<=match (?i)everything(?-i) after this line\n)(?sx).* #我们增加了一个修饰符(?s)来使点号(.)具备匹配换行符的能力。
(?x) 打开自由间隔模式。
(?s) 对于“单行模式”,使点号匹配所有字符,包括换行符。Ruby或JavaScript不支持。在Tcl中,(?s)使^匹配字符串的开头,$匹配字符串的结尾。
(?i) 使正则表达式不区分大小写。
(?-i) 减号后的所有模式修饰符都将被关闭。也就是说,只有everything是不区分大小写的。
(?⇐ 在正则表达式里,我们称之为Positive Lookbehind。它告诉正则表达式引擎在字符串中暂时向后退一步,以检查look behind内的文本是否可以在那里匹配。
所以,上面这个例子告诉我们,匹配match everything after this line\n后面的字符串,且只有everything不区分大小写,而且开启了(?sx)模式。
选择表达式类型: “结果为真(Result is TRUE)”。匹配特定行后的字符。
g修饰符不能在行中指定。可用修饰符列表可以在 pcresyntax man page 里找到。如果想了解更多的PCRE正则表达式语法,请参考 PCRE HTML documentation。
更复杂的例子
自定义正则表达式可能包含多个子表达式,可以通过提供测试字符串在Test选项卡中进行测试。
结果显示每个子表达式的状态和整个自定义表达式的状态。
总自定义表达式状态定义为 合并的结果(Combined result)。如果定义了几个子表达式,Zabbix使用AND逻辑运算符来计算 合并的结果(Combined result)。这意味着如果只要有一个结果为False,合并的结果(Combined result) 也为False状态。
全局正则表达式的说明
全局正则表达式 | 表达式 | 说明 |
---|---|---|
发现文件系统(File systems for discovery) | ^(btrfs|ext2|ext3|ext4|jfs|reiser|xfs|ffs|ufs|jfs|jfs2|vxfs|hfs|refs|ntfs|fat32|zfs)$ | 匹配“btrfs”或“ext2”或“ext3”或“ext4”或“jfs”或“reiser”或“xfs”或“ffs”或“ufs”或“jfs”或“jfs2”或“vxfs”或“hfs“或”refs“或”ntfs“或”fat32“或”zfs“ |
发现网络接口(Network interfaces for discovery) | ^Software Loopback Interface | 匹配以“Software 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发现存储设备(Storage devices for SNMP discovery) | ^(Physical memory|Virtual memory|Memory buffers|Cached memory|Swap space)$ | 匹配“Physical memory”或“Virtual memory”或“Memory buffers”或“Cached memory”或“Swap space” |
发现Windows服务名(Windows service names for discovery) | ^(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服务启动状态(Windows service startup states for discovery) | ^(automatic|automatic delayed)$ | 匹配“automatic”或“automatic delayed”。 |
支持正则表达式的位置
位置 | 正则表达式 | 全局正则表达式 | 注释 | |
---|---|---|---|---|
Agent监控项(Agent items) | ||||
eventlog[] | Yes | Yes | regexp , severity , source , eventid 参数 | |
log[] | regexp 参数 | |||
log.count[] | ||||
logrt[] | Yes/No | regexp 参数两者都支持, file_regexp 参数仅支持非全局表达式 | ||
logrt.count[] | ||||
proc.cpu.util[] | No | cmdline 参数 | ||
proc.mem[] | ||||
proc.num[] | ||||
sensor[] | device 和 sensor 参数在Linux 2.4中 | |||
system.hw.macaddr[] | interface 参数 | |||
system.sw.packages[] | package 参数 | |||
vfs.dir.count[] | regex_incl 和 regex_excl 参数 | |||
vfs.dir.size[] | regex_incl 和 regex_excl 参数 | |||
vfs.file.regexp[] | regexp 参数 | |||
vfs.file.regmatch[] | ||||
web.page.regexp[] | ||||
SNMP traps | ||||
snmptrap[] | Yes | Yes | regexp 参数 | |
监控项值预处理(Item value preprocessing) | Yes | No | pattern 参数 | |
触发器函数(Trigger functions) | ||||
count() | Yes | Yes | pattern 参数,如果 operator 参数是 regexp 或者 iregexp | |
logeventid() | pattern 参数 | |||
iregexp() | ||||
regexp() | ||||
低级别发现(Low-level discovery) | Yes | Yes | Filter 字段 | |
Web监测(Web monitoring) | Yes | No | Variables 带有 regex: 前缀 Required string 字段 | |
宏函数(Macro functions) | ||||
regsub() | Yes | No | pattern 参数 | |
iregsub() | ||||
图标映射(Icon mapping) | Yes | Yes | Expression 字段 |