2016-03-31 31 views
0

定期的に変化し続けるデータを出力するコマンドがあります。 このデータでは、私はいくつかの情報を抽出し、そこから辞書を構築する必要があります。コマンド出力文字列から特定の要素を抽出します。

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 

iは以下のようなものを探していた:私は特に「定足数」および「クォーラムマネージャー」以下

として指定を持っているそれらのノード名を探しています は、コマンドの出力例です:

NSD-1: quorum, NSD-2: quorum-manager, NSD-3:quorum-manager 

これを行うためのpythonic方法があります。あまりにも扱いにくい正規表現を使用する必要がある場合。 助けていただければ幸いです。

答えて

0

正規表現は、タスクに適しています:

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) 

別の解決策は、スプリットパーサを作成する、または単に使用することです:

results = {} 
with open('command_output') as fd: 
    for line in fd: 
     node, daemon, ip, admin, designation = line.split() 
     results[daemon] = designation 
print(results) 
0

あなたはPythonの文字列を使用することができます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) 

もう1つの方法は、ラインとリストの解説を解析するための簡単なサポートクラスを使用することです。

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]) 
関連する問題