【问题标题】:Python converting arbitrary output to table or listPython将任意输出转换为表或列表
【发布时间】:2017-08-17 12:31:52
【问题描述】:

我正在编写一个 python 脚本,它将连接到 HP C7000 机箱上的 Onboard Admin,列出所有刀片服务器并根据名称确定 Bay ID,然后使用它来列出内部交换机端口 ID。

登录后,执行脚本的第二部分(显示实际的端口映射)。响应缓冲区将包含这个长字符串。

b'show server port map 1\r\n              Mezz\r\nMezz   Mezz  Device  Port      Interconnect Interconnect\r\nSlot  Device  Port  Status         Bay        Bay Port       Device ID\r\n----  ------ ------ ---------- ------------ ------------ ----------------\r\n\r\n------------------------------- Blade 001 -------------------------------\r\n\r\n    1 QLogic QMH2562 8Gb FC HBA for HP BladeSystem c-Class\r\n            Port 1 OK            Bay 3        Port 1     50:01:43:80:21:db:8c:54\r\n            Port 2 OK            Bay 4        Port 1     50:01:43:80:21:db:8c:56\r\n\r\n    2 Not Present\r\n\r\n    3 Not Present\r\n\r\n      FlexFabric Embedded Ethernet\r\n Ethernet (NIC 1) LOM:1-a OK     Bay 1        Port 9     00:9C:02:AA:8C:58\r\niSCSI HBA (iSCSI 1) LOM:1-b OK   Bay 1        Port 9     00:9C:02:AA:8C:59\r\n  FCoE HBA LOM:1-b OK            Bay 1        Port 9     10:00:00:9C:02:AA:8C:59\r\n Ethernet (NIC 2) LOM:2-a OK     Bay 2        Port 9     00:9C:02:AA:8C:5C\r\niSCSI HBA (iSCSI 2) LOM:2-b OK   Bay 2        Port 9     00:9C:02:AA:8C:5D\r\n  FCoE HBA LOM:2-b OK            Bay 2        Port 9     10:00:00:9C:02:AA:8C:5D\r\n Ethernet (NIC 5) LOM:3-a OK     Bay 1        Port 1     00:9C:02:AA:8C:60\r\niSCSI HBA (iSCSI 3) LOM:3-b OK   Bay 1        Port 1     00:9C:02:AA:8C:61\r\n  FCoE HBA LOM:3-b OK            Bay 1        Port 1     10:00:00:9C:02:AA:8C:61\r\n Ethernet (NIC 6) LOM:4-a OK     Bay 2        Port 1     00:9C:02:AA:8C:64\r\niSCSI HBA (iSCSI 4) LOM:4-b OK   Bay 2        Port 1     00:9C:02:AA:8C:65\r\n  FCoE HBA LOM:4-b OK            Bay 2        Port 1     10:00:00:9C:02:AA:8C:65\r\n[maros@jump ~]$ '

用 .decode("utf-8") 格式化这个给我更多可读的人类输出

我感兴趣的是带有 MAC 地址的行,因为它们包含 Bay ID 和 Port ID。简而言之,我想将输出分解为单独的行,根据包含 MAC 地址的行进行过滤并提取有趣的信息(Bay ID 和 Port ID)。为了使事情变得更难,输出可能会有稍微不同的格式,如下所示:

解决这个问题的最佳方法是什么?

【问题讨论】:

  • 是否尝试过 grepping? `grep -E 'mac1|man2|macN'
  • 我相信这可以在 *nix 环境中工作,但我想留在这个 python 脚本中,我想使用这个输出来执行另一组操作,例如在每个刀片交换机的这些端口中设置 VLAN。

标签: python networking scripting paramiko


【解决方案1】:

如果您使用正则表达式,这实际上听起来很简单,因为只有您感兴趣的行实际上包含所有属性(bay id、port id 和 mac)。

想象一下下面的测试(它实际上可以写成一个衬里,但让我们扩展它以更容易阅读):

import re
r=re.compile(r"\sPort\s+(\d+)\s+Bay\s+(\d+)\s+(([0-9A-F]{2}:){5,}..)")
for line in lines:
    m = r.match(line)
    if not m: continue
    print("We have bay %s slot %s mac %s"%(m.group(1), m.group(2), m.group(3))

【讨论】:

  • 我喜欢这种带有表达式的方法,但我觉得我需要从缓冲区重新打包该响应,没有它它会将每个字符视为一行:M e z z \ r \ n M e z z M e z z D e v i c e P o r t
  • 重新包装是什么意思?如果输出是字节,则需要将其编码为字符串,并用新行分割。然后你可以应用上面的 for 循环对结果做任何你想做的事情......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-08
  • 2021-01-06
  • 1970-01-01
  • 2021-04-17
  • 1970-01-01
  • 2020-06-13
相关资源
最近更新 更多