2016-03-05 137 views
-1

我有一个文件,在这种情况下叫做alarm.file。下面的代码遍历文件的每一行,如果包含“Blade_HostName”它将其添加到一个列表中,并将该行的分离版本分配给一个变量,则它检查该文件中的“Node:”并添加Blade_HostName作为字典中的关键字,并添加“节点:”作为键的值。返回字典中具有相同值的所有密钥

我被困在下一步。我希望它通过字典并返回共享相同值的所有密钥。我可以从那里处理它。

从返回的键列表中,我将使用子过程ssh到该值,对所有具有该值的键运行一个命令,然后对每个具有其他唯一值的键执行相同的操作(如注释所示在底部的代码)。

在此先感谢。

样品的alarm.file的情况下,它需要:

报警类型:寄存重新启动警报
节点:10.xx.xx.2
主机名:
摘要:电子CM_HELLO 7213存储10。 xx.xx.1重新启动
BladeIP_Storage_Was_restarted = 10.xx.xx.1
Blade_HostName = r33b26
Xcat_Info = njxcat01
地区= NJ
甲cknowledged:0
FirstOccurrence:2016年2月24日9点49分32秒EST
LastOccurrence:2016年2月24日9点49分32秒EST
出现次数= 1
数-------- -----------

报警类型:寄存重新启动警报
节点:10.xx.xx.2
主机名:
摘要:电子CM_HELLO 7213存储10.xx.xx.2已重新启动
BladeIP_Storage_Was_restarted = 10.xx.xx.2
Blade_HostName = r39b14
Xcat_Info = njxcat01
地区= NJ
确认:0
FirstOccurrence:2016年2月24日9时49分40秒EST
LastOccurrence:2016年2月24日9时49分40秒EST
发生次数= 1种
-------------------

报警类型:寄存重新启动警报
节点:10.xx.xx.3
主机名:
摘要: E CM_HELLO 7213存储10.xx.xx.3重新启动
BladeIP_Storage_Was_restarted = 10.xx.xx.3
Blade_HostName = r54b05
Xcat_Info = njxcat01
地区= NJ
确认:0
FirstOccurrence:2016年2月24日9点49分43秒EST
LastOccurrence:2016年2月24日9点49分43秒EST = 1
-------------------
发生

#!/usr/bin/python3 

import os, sys, subprocess 

myRackDict = {} 
myRack = "" 
myListX = [] 
myBladeList = [] 

if len(sys.argv) <= 1: 
    print('Not a valid file, please try again') 
    sys.exit() 
elif len(sys.argv) > 1: 
    myFile = sys.argv[1] 
    if myFile == '': 
     sys.exit() 

with open(myFile, 'r') as f: 
    for line in f: 
     if 'Blade_HostName' in line: 
      line = line.replace('Blade_HostName = ', '') 
      line = line.rstrip('\n') 
      line = line.lstrip() 
      #print(line) 
      myRack = line 
      #myBladeList.append(myRack) 
     elif 'Node: ' in line: 
      line = line.rstrip('\n') 
      line = line.lstrip(' ') 
      line = line.replace('Node: ', '') 
      if not myRack in myRackDict.keys(): 
       myRackDict[myRack] = line 
      else: 
       continue 

print(myRackDict) 
#myString = ('for i in ' + ' '.join(myBladeList) + ' ;do echo $i; psh $i monit summary; done') 
#print(myString) 

""" 
mySsh = subprocess.check_output("ssh " + "[email protected]" + myxCat['hixxcat'] + " 'psh r1046b01 monit summary'", shell=True) 
encoded = mySsh.decode() 
print(encoded) 
""" 
+1

你有另一个问题。由于节点先于Blade_HostName,因此'myRackDict [myRack] = line'正在使用上一节中的旧刀片。 – tdelaney

+0

我没有意识到..谢谢你指出。我会看看我能否修复。 – Dimurof82

+0

@tdelaney我看到我把它搞砸了。 Orignally我正在使用Blade_HostName后出现的另一个字段,并将其更改为Node。我会重新安排。再次感谢您指出。 – Dimurof82

回答

1

您可以用defaultdict使每个值与密钥列表关联容易做到这一点。

import collections 

val_map = collections.defaultdict(list) 
for k,v in myRackDict.items(): 
    val_map[v].append(k) 
+0

完美工作。谢谢。 – Dimurof82

1

环路dict在:

d = {"foo": 1, "bar": 2, "baz": 1} 
keys_for_1 = [k for k in d if d[k] == 1] 
print(keys_for_1) 

输出:

['foo', 'baz'] 
相关问题