首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从命令输出字符串中提取特定元素

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

Stack Overflow用户
提问于 2016-03-31 15:29:29
回答 2查看 886关注 0票数 0

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

以下是该命令的示例输出:

代码语言:javascript
复制
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

我正在寻找类似于下面的东西:

代码语言:javascript
复制
NSD-1: quorum, NSD-2: quorum-manager, NSD-3:quorum-manager

有没有一种蟒蛇的方法来做到这一点。如果我必须使用正则表达式,那可能太麻烦了。感谢您的帮助。

EN

回答 2

Stack Overflow用户

发布于 2016-03-31 16:15:29

正则表达式非常适合这项任务:

代码语言:javascript
复制
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:

代码语言:javascript
复制
results = {}
with open('command_output') as fd:
    for line in fd:
        node, daemon, ip, admin, designation = line.split()
        results[daemon] = designation
print(results)
票数 0
EN

Stack Overflow用户

发布于 2016-03-31 16:32:42

您可以在表行上使用Python string的split()方法:

代码语言:javascript
复制
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)

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

代码语言:javascript
复制
class NodeInfo(list):
    '''
    This class provides property access to the table columns
    and string formatting for the output.
    '''

    @property
    def node(self):
        return self[0]

    @property
    def daemon_node(self):
        return self[1]

    @property
    def ip(self):
        return self[2]

    @property
    def admin_node(self):
        return self[3]

    @property
    def designation(self):
        if len(self) > 4:
            return self[4]
        return ""

    def __str__(self):
        return "{}: {}".format(self.admin_node, self.designation)

designations = ('quorum', 'quorum-manager')

nodes = [NodeInfo(line.split()) for line in table_lines]
selected_nodes = filter(lambda n: n.designation in designations, nodes)

print ", ".join([str(node) for node in selected_nodes])
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36326860

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档