使用Python Regex解析Nagios/Icinga配置

2024-05-19 10:08:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试解析Nagios/Icinga配置,以便可以使用Python对其进行进一步的处理。因为我找不到一个工作库来完成这项工作(pynag似乎根本不起作用),所以我尝试使用regex编写一个简单的Python脚本来实现这一点。在

基本上我想从这个配置文件(它使用制表符进行缩进):

define host {
    address 123.123.123.123
    passive_checks_enabled  1
    }

define service {
    service_description Crondaemon
    check_command   check_nrpe_1arg!check_crondaemon
    }

像这样的Python元组:

^{pr2}$

这是我的完整脚本,其中包含一个要测试的示例:

^{3}$

不幸的是,我不能让完整的解析工作,它总是匹配所有或不匹配。 你能给我一个提示如何修复我的正则表达式,这样我就可以从我的Icinga配置中提取所有的键值对吗?在


Tags: 脚本hostaddresscheck配置文件serviceenabled制表符
1条回答
网友
1楼 · 发布于 2024-05-19 10:08:32

re模块不支持重复捕获,因此

'(\t(.*)?\t(.*)?\n)*'

只保留最后一个组捕获。在

同样的,我会把它变成那样

^{pr2}$

因此,在给定数据结构的情况下,一个可能的解决方案是创建一个正则表达式,该表达式将匹配任一模式:

regex = r'define\s+(\w+)\s+\{\n|\t(\w+)\s+([^\n]*)\n|\t\}'
matches = re.finditer(regex, TEST_STR, re.DOTALL)

有了for循环,您可以迭代组

for match in matches:
    for groupNum in range(0, len(match.groups())):
        groupNum = groupNum + 1
        if match.group(groupNum):
            print("Group {}: {}".format(groupNum, match.group(groupNum)))

返回:

Group 1: host
Group 2: address
Group 3: 123.123.123.123
Group 2: passive_checks_enabled
Group 3: 1
Group 1: service
Group 2: service_description
Group 3: Crondaemon
Group 2: check_command
Group 3: check_nrpe_1arg!check_crondaemon

相关问题 更多 >

    热门问题