2014-01-08 54 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