2017-08-08 50 views
0

我想解析一個Nagios/Icinga配置,所以我可以用Python對它進行進一步處理。由於我找不到工作庫來做到這一點(pynag似乎根本無法工作),我正在嘗試使用正則表達式編寫一個簡單的Python腳本。用Python解析Nagios/Icinga配置正則表達式

基本上我想從這個CONFIGFILE得到(它使用縮進選項卡):

define host { 
    address 123.123.123.123 
    passive_checks_enabled 1 
    } 

define service { 
    service_description Crondaemon 
    check_command check_nrpe_1arg!check_crondaemon 
    } 

到像這樣的Python元組:

(
('host', ('address', '123.123.123.123'), ('passive_checks_enabled', '1')), 
('service', ('service_description', 'Crondaemon'), ('check_command', 'check_nrpe_1arg!check_crondaemon')) 
) 

這是我與分析邏輯完整的腳本,包括一個例子來測試:

import re 

# white spaces are tabs! 
TEST_STR = """ 
define host { 
    address 123.123.123.123 
    passive_checks_enabled 1 
    } 

define service { 
    service_description Crondaemon 
    check_command check_nrpe_1arg!check_crondaemon 
    } 
""" 

cfg_all_regex = re.compile(
    r'define\s+(\w+)\s*\{' 
    '(.*?)' 
    '\t}', 
    re.DOTALL 
) 
# basic regex works 
print(re.findall(cfg_all_regex, TEST_STR)) 

cfg_all_regex = re.compile(
    r'define\s+(\w+)\s*{\n' 
    '(\t(.*)?\t(.*)?\n)*' 
    '\t}', 
    re.DOTALL 
) 
# more specific regex to extract all key values fails 
print(re.findall(cfg_all_regex, TEST_STR)) 

不幸的是,我不能得到完整的解析工作,它總是匹配一切或沒有。 你能給我一個提示如何修復我的正則表達式,所以我可以從我的Icinga配置中提取所有的鍵值對嗎?

回答

1

重模塊不支持重複捕捉,所以

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

只保留了最後一組拍攝。

同樣我會改變這個像

'\t(\w+)\s+([^\n]*)\n\' 

因此,一個可能的解決方案,給您的數據的結構,可以創建一個正則表達式將匹配模式:

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))) 

return:

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 
+0

哇,沒想到這不能用簡單的正則表達式解決。但是你的解決方案就像一個魅力,我可以完成我的解析器。最終的邏輯可以在這裏找到:https://gist.github.com/ifischer/6e8aa105c5f644fd3803f8b41dcbe4f3 非常感謝你的幫助,節省了我很多時間擺弄! – ifischer

+1

剛剛發現[regex](https://pypi.python.org/pypi/regex/)支持重複捕獲。也許這個解決方案可以簡化很多。但現在不值得努力 – ifischer

+0

你是對的。如果在項目中安裝第三方庫是可行的,則正則表達式模塊是更好的選擇。 – alvarez