从命令输出字符串中提取特定元素

2024-04-27 09:32:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个命令,输出一些数据,这些数据会定期变化。 在这些数据中,我需要提取一些信息,并从中建立一个字典。 我特别寻找那些被指定为“quorum”和“quorum manager”的节点名称

下面是命令的示例输出:

GPFS cluster information
========================
  GPFS cluster name:         codev.NSD-1
  GPFS cluster id:           8865240017152489758
  GPFS UID domain:           codev.NSD-1
  Remote shell command:      /usr/bin/ssh
  Remote file copy command:  /usr/bin/scp
  Repository type:           CCR

 Node  Daemon node name  IP address   Admin node name  Designation
-------------------------------------------------------------------
   1   NSD-1             192.168.0.1  NSD-1            quorum
   2   NSD-2             192.168.0.2  NSD-2            quorum-manager
   3   NSD-3             192.168.0.3  NSD-3            quorum-manager
   4   NSD-4             192.168.0.4  NSD-4            manager
   5   client-1          192.168.0.5  client-1

我在找下面这样的东西:

^{pr2}$

有没有Python式的方法可以做到这一点。如果我必须使用正则表达式,那可能太麻烦了。 感谢任何帮助。在


Tags: 数据name命令clientnodebinremoteusr
2条回答

Regex非常适合此任务:

results = {}
with open('command_output') as fd:
    for line in fd:
        match = re.fullmatch('\s+[0-9]+\s+([^\s]+)\s+[0-9\.]+\s+([^\s]+)\s+([a-z-]+)', line)
        if match:
            daemon, admin, designation = match.groups()
            results[daemon] = designation
print(results)

另一种解决方案是创建解析器,或者只使用split:

^{pr2}$

可以对表行使用Python strings'split()方法:

nodes = []

for line in table_lines:
    # line = "  1   NSD-1             192.168.0.1  NSD-1            quorum"

    (node, daemon_node, ip, admin_node, designation) = line.split()

    if designation in ('quorum', 'quorum-manager'):
        nodes.append("{}: {}".format(admin_node, designation))

# Print the selected nodes as comma separated list
print ", ".join(nodes)

另一种方法是使用一个简单的支持类来解析行和列表的理解:

^{pr2}$

相关问题 更多 >