2014-01-08 95 views
2

我想解析一個配置設置文件,我從stdout通過ssh腳本獲取。我需要將這些轉換爲鍵/值對。該配置設置是這個樣子:在python中解析配置設置

輸出設定

show all <==== TRYING TO KEEP THIS LINE FROM BEING PARSED 
Active System Configuration  <==== TRYING TO KEEP THIS LINE FROM BEING PARSED 
# General Information 
    Unit undefined 
    Subdivision undefined 
    Address undefined 
    Site ID undefined 
    Device ID 0 
# Application FOO Information 
    FOO BAR AAA 0000 
    FOO Checkin 0000 
# LSD Status Information 
    LSD not configured/built for vital parameters. 
# System Time 
    Local Time 01-08-14 16:13:50 
    Time sync Source None 
# Last Reset: 
    A Processor:01-08-14 16:04:31 -- App Select Alarm Not Cleared 
    B Processor:01-08-14 16:04:26 -- A Processor Initiated Reset 
# Active Alarms: 
    01-08-14 16:04:33 -- App Select Required 
# Comm Settings - Port 1 
    MAC Address 00:00:00:00:01:D3 
    IP Address 172.168.0.11 
    SubnetMask 255.255.255.0 
    DCDC Server Enabled 
    DCDC Server IP Pool Start 172.168.0.11 
    DCDC Server IP Pool End 172.168.0.43 
    DCDC Server Default Gateway 0.0.0.0 
# Comm Settings - Port 2 
    MAC Address 00:00:00:00:01:D3 
    IP Address 172.168.0.11 
    SubnetMask 255.255.255.0 
    DCDC Server Enabled 
    DCDC Server IP Pool Start 172.168.0.11 
    DCDC Server IP Pool End 172.168.0.44 
    DCDC Server Default Gateway 0.0.0.0 
    Default Gateway 0.0.0.0 
# Comm Settings - Routing Table 
    Route #1 - Disabled 
    Route #2 - Disabled 
    Route #3 - Disabled 
    Route #4 - Disabled 
    Route #5 - Disabled 
    Route #6 - Disabled 
    Route #7 - Disabled 
    Route #8 - Disabled 
# Comm Settings - HTTP Settings 
    HTTP TCP Port# 1000 
    Inactivity timeout 60 
    Trusted Source 1 Status Disabled 
    Trusted Source 1 IP Addr 0.0.0.0 
    Trusted Source 1 Net Mask 0.0.0.0 
    Trusted Source 2 Status Disabled 
    Trusted Source 2 IP Addr 0.0.0.0 
    Trusted Source 2 Net Mask 0.0.0.0 
# Comm Settings - Count Settings 
    Count Port 1 Enabled 
    Count Port 2 Enabled 
    Inactivity timeout 0 
    HTTP TCP Port# 23 
    Trusted Source 1 Status Disabled 
    Trusted Source 1 IP Addr 0.0.0.0 
    Trusted Source 1 Net Mask 0.0.0.0 
    Trusted Source 2 Status Disabled 
    Trusted Source 2 IP Addr 0.0.0.0 
    Trusted Source 2 Net Mask 0.0.0.0 
# Comm Settings - SSH Settings 
    SSH Port 1 Enabled 
    SSH Port 2 Enabled 
    SSH Inactivity timeout 0 
    SSH Server Port# 10 
# Comm Settings - Diagnostic Port Settings 
    Bad Rate 57000 
    Parity None 
    Data Bits 8 
    Stop Bits 1 
    Flow Control Disabled 
# Executive Information 
    PN 050000-000 
    Ver 8.09Bld0000F 
    Module KMO-3 
    Processor A 
    Copyright FOO(C)2013 
    TXT AAA0AAA0 
# 
    PN 050000-000 
    Ver 8.09Bld0000F 
    Module KMO-3 
    Processor B 
    Copyright FOO(C)2013 
    TXT ABB0ABB0 
# 
    PN 050000-000 
    Ver 8.09Bld0000F 
    Module KMO-3 
    Processor C 
    Copyright FOO(C)2013 
    TXT BCC0BCC0 
# 
    HPN 202551-001 
    Ver 1.1 
    Module CDU 
    Processor DF123000 
    Ref U2 
    Copyright FOO(C)2013 
    Datecode 060808 

# Boot Information 
    PN 072000-000 
    Ver 5.12Bld002 
    Module FOO-3 
    Processor A 
    Copyright FOO(C)2012 
    TXT DCC0DCC0 
# 
    PN 072000-000 
    Ver 5.12Bld002 
    Module FOO-3 
    Processor B 
    Copyright FOO(C)2012 
    TXT EFF0EFF0 
# 
    PN 072000-000 
    Ver 5.12Bld002 
    Module FOO-3 
    Processor C 
    Copyright FOO(C)2012 
    TXT EEE0EEE0 
# BAR Application 
    BAR MAP file not loaded 
    BAR CONFIG file not loaded 
# ROK Key Management Configuration 
    Encrypted CARR Key (No CARR Key Present) 
    Encrypted CARR TXT (No CARR Key Present) 
    Pending Encrypted CARR Key (No Future CARR Key Present) 
    Pending Encrypted CARR TXT (No Future CARR Key Present) 
    RC2 Key File TXT (No RC2 Key Present) 
# Vital Application Information 
    Name VVDefault App 
    Index 0 
    EPT TXT 2578 
    EPT Checkin 80DC 
# Non-Vital Application Information 
    Name BBDefault App 
    Index 0 
    EPT TXT 521D 
    EPT Checkin 64E0 
# ROK Vital Configuration 
    ROK not configured/build for vital parameters. 
# ROK Non-Vital Configuration 
    ROK not configured/built for non-vital parameters. 
# SNMP General Configuration 
    Build incomplete - ZZ2 module may not present. 
SSH>  <==== TRYING TO KEEP THIS LINE FROM BEING PARSED 

PARSER

# BNF for data 

# dataGroups ::= "#" + Optional(restOfLine) 
# keyword ::= (alpha+)+ 
# value ::= (alpha+) 
# configDef ::= Group(keyname + value) 


hashmark = Literal('#').suppress() 
snmpCommand = Literal("show all").suppress() 
sshResidue = Literal("SSH>").suppress() 
keyname = Word(alphas,alphanums+'-') 
value = Combine(empty + SkipTo(LineEnd())) 
GCONF = Keyword("#") 
configDef = Group(GCONF + value("name") + \ 
    Dict(OneOrMore(Group(~GCONF + keyname + value)))) 
configDef = Group(value("name") + \ 
    Dict(OneOrMore(Group(keyname + value)))) 

configDef.ignore(snmpCommand) 
configDef.ignore(sshResidue) 
configDef.ignore(hashmark) 

# parse the data 
ifcdata = OneOrMore(configDef).parseString(data) 

for ifc in ifcdata: 
    print ifc.dump() 

以上就是我正在使用pyparsing,通過閱讀Getting Started with Pyparsing但仍然掛斷。現在我已經解析了一切,甚至是「全部顯示」和「主動系統配置」。我正在考慮如何省略這些,然後根據「#」符號對這些設置進行分組,因爲這是唯一相似的標識符。我需要解析的數據看起來是這樣的:

解析數據

['General Information',['Unit', 'undefined',],['Subdivision', 'undefined',],['Address', 'undefined'],['Site ID','undefined'],['Device ID', '0']] 
['Application FOO Information',['FOO BAR', 'AAA 0000'],['FOO Checkin', '0000']] 
['LSD Status Information', ['LSD', 'not configured/built for vital parameters.']] 
['System Time', ['Local Time', '01-08-14 16:13:50'],['Time sync Source', 'None']] 
['Last Reset:', ['A Processor', '01-08-14 16:04:31 -- App Select Alarm Not Cleared']['B Processor', '01-08-14 16:04:26 -- A Processor Initiated Reset']] 
['Active Alarms:', ['01-08-14 16:04:33', 'App Select Required']] 
.... and so on 

我玩pyparsing這個,因爲這個職位超過here。我非常喜歡這個模塊。任何幫助是極大的讚賞。謝謝!

+0

我的pyparsing有點生疏,但您應該能夠創建一個鍵值列表,其中鍵爲以#{somestring}開頭的那些行,以及您需要解析子結構的任何值。您可以通過這種方式提取Executive Information部分,然後在Ver之後查找所有內容應該很簡單。 –

+0

@EelcoHoogendoorn我想我明白了,我會給它一個旋轉。我會更新它的方式。謝謝! – tjoenz

+0

@urbanrunic你如何建議將「FOO BAR AAA 0000」'分成'「FOO BAR」+「AAA 0000」'?更一般地說,你想如何將每個鍵值行劃分爲一個鍵和一個值?如果你沒有一個適用於整個配置文件的通用規則(而且看起來並不像你這樣做),那麼你需要爲每個單獨的類別編寫「pyparsing」規則,或者處理每個人通過pyparsing運行配置文件後分別分類。 – senshin

回答

3

考慮一下:

from pyparsing import * 
import re 

data = ... # data goes here 

date_regex = re.compile(r'\d\d-\d\d-\d\d') 
time_regex = re.compile(r'\d\d:\d\d:\d\d') 
pairs = [{'category': 'General Information', 
      'kv': Group(Word(alphanums) + Word(alphanums))}, 
     {'category': 'Last Reset:', 
      'kv': Group(Word(alphas, max=1) + Word(alphas)) + Literal(':').suppress() 
       + Group(Regex(date_regex) + Regex(time_regex) 
       + Optional(SkipTo(LineEnd()))) 
      } 
     ] 
# build list of categories with associated parsing rules 
categories = [Word("# ").suppress() + x['category'] 
       + OneOrMore(Group(x['kv'])) 
       for x in pairs] 
# account for thing you don't have specific rules for 
categories.append(Word("#").suppress() + Optional(SkipTo(LineEnd())) + 
        Group(OneOrMore(Combine(Word(alphanums) + SkipTo(LineEnd())))) 
       ) 
# OR all the categories together 
categories_ored = categories[0] 
for c in categories[1:]: 
    categories_ored |= c 
configDef = OneOrMore(categories_ored) 
suppress_tokens = ["show all", "SSH>", "Active System Configuration"] 
suppresses = [Literal(x).suppress() for x in suppress_tokens] 
for s in suppresses: 
    configDef.ignore(s) 

result = configDef.parseString(data) 
for e in result: 
    print(e) 

這給你以下結果:

General Information 
[['Unit', 'undefined']] 
[['Subdivision', 'undefined']] 
[['Address', 'undefined']] 
[['Site', 'ID']] 
[['undefined', 'Device']] 
[['ID', '0']] 
Application FOO Information 
['FOO BAR AAA 0000', 'FOO Checkin 0000'] 
LSD Status Information 
['LSD not configured/built for vital parameters.'] 
System Time 
['Local Time 01-08-14 16:13:50', 'Time sync Source None'] 
Last Reset: 
[['A', 'Processor'], ['01-08-14', '16:04:31', '-- App Select Alarm Not Cleared']] 
[['B', 'Processor'], ['01-08-14', '16:04:26', '-- A Processor Initiated Reset']] 
Active Alarms: 
['01-08-14 16:04:33 -- App Select Required'] 
Comm Settings - Port 1 
['MAC Address 00:00:00:00:01:D3', 'IP Address 172.168.0.11', 'SubnetMask 255.255.255.0', 'DCDC Server Enabled', 'DCDC Server IP Pool Start 172.168.0.11', 'DCDC Server IP Pool End 172.168.0.43', 'DCDC Server Default Gateway 0.0.0.0'] 
Comm Settings - Port 2 
['MAC Address 00:00:00:00:01:D3', 'IP Address 172.168.0.11', 'SubnetMask 255.255.255.0', 'DCDC Server Enabled', 'DCDC Server IP Pool Start 172.168.0.11', 'DCDC Server IP Pool End 172.168.0.44', 'DCDC Server Default Gateway 0.0.0.0', 'Default Gateway 0.0.0.0'] 
Comm Settings - Routing Table 
['Route #1 - Disabled', 'Route #2 - Disabled', 'Route #3 - Disabled', 'Route #4 - Disabled', 'Route #5 - Disabled', 'Route #6 - Disabled', 'Route #7 - Disabled', 'Route #8 - Disabled'] 
Comm Settings - HTTP Settings 
['HTTP TCP Port# 1000', 'Inactivity timeout 60', 'Trusted Source 1 Status Disabled', 'Trusted Source 1 IP Addr 0.0.0.0', 'Trusted Source 1 Net Mask 0.0.0.0', 'Trusted Source 2 Status Disabled', 'Trusted Source 2 IP Addr 0.0.0.0', 'Trusted Source 2 Net Mask 0.0.0.0'] 
Comm Settings - Count Settings 
['Count Port 1 Enabled', 'Count Port 2 Enabled', 'Inactivity timeout 0', 'HTTP TCP Port# 23', 'Trusted Source 1 Status Disabled', 'Trusted Source 1 IP Addr 0.0.0.0', 'Trusted Source 1 Net Mask 0.0.0.0', 'Trusted Source 2 Status Disabled', 'Trusted Source 2 IP Addr 0.0.0.0', 'Trusted Source 2 Net Mask 0.0.0.0'] 
Comm Settings - SSH Settings 
['SSH Port 1 Enabled', 'SSH Port 2 Enabled', 'SSH Inactivity timeout 0', 'SSH Server Port# 10'] 
Comm Settings - Diagnostic Port Settings 
['Bad Rate 57000', 'Parity None', 'Data Bits 8', 'Stop Bits 1', 'Flow Control Disabled'] 
Executive Information 
['PN 050000-000', 'Ver 8.09Bld0000F', 'Module KMO-3', 'Processor A', 'Copyright FOO(C)2013', 'TXT AAA0AAA0'] 

['PN 050000-000', 'Ver 8.09Bld0000F', 'Module KMO-3', 'Processor B', 'Copyright FOO(C)2013', 'TXT ABB0ABB0'] 

['PN 050000-000', 'Ver 8.09Bld0000F', 'Module KMO-3', 'Processor C', 'Copyright FOO(C)2013', 'TXT BCC0BCC0'] 

['HPN 202551-001', 'Ver 1.1', 'Module CDU', 'Processor DF123000', 'Ref U2', 'Copyright FOO(C)2013', 'Datecode 060808'] 
Boot Information 
['PN 072000-000', 'Ver 5.12Bld002', 'Module FOO-3', 'Processor A', 'Copyright FOO(C)2012', 'TXT DCC0DCC0'] 

['PN 072000-000', 'Ver 5.12Bld002', 'Module FOO-3', 'Processor B', 'Copyright FOO(C)2012', 'TXT EFF0EFF0'] 

['PN 072000-000', 'Ver 5.12Bld002', 'Module FOO-3', 'Processor C', 'Copyright FOO(C)2012', 'TXT EEE0EEE0'] 
BAR Application 
['BAR MAP file not loaded', 'BAR CONFIG file not loaded'] 
ROK Key Management Configuration 
['Encrypted CARR Key (No CARR Key Present)', 'Encrypted CARR TXT (No CARR Key Present)', 'Pending Encrypted CARR Key (No Future CARR Key Present)', 'Pending Encrypted CARR TXT (No Future CARR Key Present)', 'RC2 Key File TXT (No RC2 Key Present)'] 
Vital Application Information 
['Name VVDefault App', 'Index 0', 'EPT TXT 2578', 'EPT Checkin 80DC'] 
Non-Vital Application Information 
['Name BBDefault App', 'Index 0', 'EPT TXT 521D', 'EPT Checkin 64E0'] 
ROK Vital Configuration 
['ROK not configured/build for vital parameters.'] 
ROK Non-Vital Configuration 
['ROK not configured/built for non-vital parameters.'] 
SNMP General Configuration 
['Build incomplete - ZZ2 module may not present.'] 

我實現了在pairs解析幾個鍵值對,並增加了一個備用的救世主沒有實現特定的解析規則(categories.append()部分)。這也成功地保留了您不想要的行("SSH>"等)不在解析輸出中。我希望這有幫助。

+0

謝謝, 這很棒。這是我第一次解析,我開始時只用正則表達式解析,並發現pyparsing,我認爲這可能會使這個簡單,直到我開始深入。你的幫助是非常感激,並把我放在正確的軌道。再次感謝你! – tjoenz