【问题标题】:Algorithm to identify keys and values from cli string outputs从 cli 字符串输出中识别键和值的算法
【发布时间】:2019-03-30 16:50:14
【问题描述】:

我有一个命令show interface transciever,其输出可能会有所不同。 我已经为这个命令收集了一些针对不同场景的示例输出。

Ethernet1/2
    transceiver is present
    type is 1000base-T
    name is CISCO-METHODE
    part number is SP7041-E-R
    revision is --
    serial number is MTC19350BBK
    nominal bitrate is 1300 MBit/sec
    Link length supported for copper is 100 m
    cisco id is 3
    cisco extended id number is 4

Ethernet1/3
    transceiver is present
    type is 1000base-T
    name is CISCO-METHODE
    part number is SP7041-E
    revision is E
    serial number is MTC150303LW
    nominal bitrate is 1300 MBit/sec
    Link length supported for copper is 100 m
    cisco id is 3
    cisco extended id number is 4

Ethernet1/4
    transceiver is present
    type is 1000base-T
    name is CISCO-METHODE
    part number is SP7041-E
    revision is E
    serial number is MTC1731072M
    nominal bitrate is 1300 MBit/sec
    Link length supported for copper is 100 m
    cisco id is 3
    cisco extended id number is 4

Ethernet1/5
    transceiver is not present

Ethernet1/6
    transceiver is not present

Ethernet1/7
    transceiver is present
    type is 10Gbase-SR
    name is CISCO-AVAGO
    part number is SFBR-709SMZ-CS1
    revision is G4.1
    serial number is AVD1718A4WN
    nominal bitrate is 10300 MBit/sec
    Link length supported for 50/125um OM2 fiber is 82 m
    Link length supported for 62.5/125um fiber is 26 m
    Link length supported for 50/125um OM3 fiber is 300 m
    cisco id is 3
    cisco extended id number is 4
    cisco part number is 10-2415-03
    cisco product id is SFP-10G-SR
    cisco vendor id is V03

^^ 一些样本。 我想比较这些不同的样本并确定潜在的键和值。

喜欢:

  • 存在收发器
  • 收发器不存在

transceiver is 可以是键,present/not present 可以是值。 同样,我想解析这些输出样本以识别其他键和值。是否有标准算法可以带我朝着正确的方向实现这一目标。

【问题讨论】:

  • 到目前为止你有什么尝试?
  • 检查该工具是否具有生成机器可读输出的选项。许多现代 CLI 工具可以通过命令行开关输出 JSON 或 XML。
  • @tripleee 不幸的是它不可用,这些 cli 工具是很久以前开发的

标签: python algorithm language-agnostic string-comparison


【解决方案1】:

我不知道标准算法,但是对于这个示例,您应该搜索' is ' 的实例并将键定义为前面的文本,将值定义为后面的文本文本。

这是一个例子:

# Sample data
string = '''Ethernet1/2
    transceiver is present
    type is 1000base-T
    name is CISCO-METHODE
    part number is SP7041-E-R
    revision is --
    serial number is MTC19350BBK
    nominal bitrate is 1300 MBit/sec
    Link length supported for copper is 100 m
    cisco id is 3
    cisco extended id number is 4'''

sub = string.split('\n')

d = {}
d[sub[0]] = [x.strip() for x in sub[1:]]

e = {}
for key in d.keys():
    e[key] = {}
    for item in d[key]:
        new = item.split(' is ')
        e[key][new[0]] = new[1]
print(e)
{'Ethernet1/2': 
    {'transceiver': 'present', 
     'type': '1000base-T', 
     'name': 'CISCO-METHODE', 
     'part number': 'SP7041-E-R', 
     'revision': '--', 
     'serial number': 'MTC19350BBK', 
     'nominal bitrate': '1300 MBit/sec', 
     'Link length supported for copper': '100 m', 
     'cisco id': '3', 
     'cisco extended id number': '4'}}

如果有多个级别的实例,您可以通过额外的解析来识别它们,例如搜索' for '的实例并重复该过程。

【讨论】:

  • 感谢您的帮助,但我不想通过使用 isfor 等特定关键字进行解析来概括解决方案。这只是我们正在尝试开发的一个 cli,它也是许多其他 cli 工具的通用解析器,并且不同 cli 工具之间没有统一的输出结构。
  • 没有通用的算法,因为不同的工具有不同的约定。为每种特定格式编写解析器似乎是不可避免的。或者,如果您想尝试一下,您有获得优秀博士学位的材料。
  • @madcolonel10 可以假设您要解析的数据是什么?每个键/值都包含在一行中?他们的钥匙总是第一位的?每个特定键的出现次数是否多于该键的唯一值?
  • @tripleee 我正在考虑使用github.com/devongovett/regexgen。我打算从所有样本中为唯一行生成一个正则表达式,并且在生成正则表达式之后(例如/transeiver is (?:not )?present/)我打算从中提取非正则表达式部分。你认为这是一个好方法吗
  • @Nathaniel 我们不能假设 key 总是第一位的,现在我们可以假设 key 和 value 在同一行
猜你喜欢
  • 2020-12-04
  • 2013-07-31
  • 2021-11-12
  • 1970-01-01
  • 2017-05-13
  • 2015-11-08
  • 2018-07-15
  • 2012-09-04
  • 1970-01-01
相关资源
最近更新 更多