2017-09-23 37 views
0

我有幾個文件需要從中提取某些信息: 文件內容的示例(並非我已經屏蔽了IP)。每個文件可以是約15K線,下面的示例內容:來自文本文件的報告 - python

(*, 224.0.0.50/32), uptime: 27w6d, igmp ip pim      
    Incoming interface: Ethernet1/36, RPF nbr: 1.1.1.2, uptime: 1w4d 
    Outgoing interface list: (count: 3)        
    Ethernet1/47, uptime: 1w5d, pim        
    Vlan25, uptime: 7w4d, igmp          
    Vlan20, uptime: 27w6d, igmp         

(1.1.1.1/32, 224.0.0.50/32), uptime: 09:51:59, ip mrib pim    
    Incoming interface: Ethernet1/36, RPF nbr: 1.1.1.2, uptime: 09:51:59 
    Outgoing interface list: (count: 3)         
    Ethernet1/47, uptime: 09:51:59, pim        
    Vlan20, uptime: 09:51:59, mrib          
    Vlan25, uptime: 09:51:59, mrib 

我需要做的是通過文件和打印運行如下:

Source IP Group IP  Incoming Interface  Outgoing Interface 
1.1.1.1 224.0.0.50 Ethernet1/36   Vlan20, Vlan25 

我寫的是這樣的:

import re 

mroute = open("multicast.txt", 'r') 

for line in mroute: 
    if re.match("(.*)(\()1(.*)", line): 
     print line 
for line in mroute: 
    if re.match("(.*)(In)(.*)",line): 
     print line 
for line in mroute: 
    if re.match("(^)(Out)(.*)",line): 
     print line 

然而,每個部分獨立工作時,我加入他們不顯示任何東西。

回答

0

我相信你的問題是你的每個for line in mroute耗盡了迭代器。一個更好的方法是收集一組線並按照處理方式處理它們。

這裏是什麼,我會先從

import sys, re 

class Details(dict): 
    _format = '%(source)-20s %(group)-20s %(incoming)-20s %(outgoing)-20s' 
    header = _format % { 
     'source':'Source IP', 
     'group': 'Group IP', 
     'incoming': 'Incoming Interface', 
     'outgoing': 'Outgoing Interface' 
    } 
    def __repr__(self): 
     return self._format % self 

    def __init__(self, g): 
     super(Details, self).__init__() 
     self.g = g 
     self.parse_line(0, "^[(](?P<source>[^,]+), (?P<group>[^)]+)") 
     self.parse_line(1, "^ Incoming interface: (?P<incoming>[^,]+),") 
     self.parse_line(2, "^ Outgoing interface list: (?P<unused>.+)") 
     for l in self.g[3:]: 
      p = "^ ([^,]+)," 
      m = re.search(p, l) 
      if m: 
       o = self.get('outgoing','') 
       if o: o += ', ' 
       self['outgoing'] = o + m.group(1) 

    def parse_line(self, n, p, u='?'): 
     r = re.compile(p) 
     e = {x:u for x in r.groupindex} 
     m = r.search(self.g[n]) 
     d = m.groupdict() if m else e 
     self.update(d) 

    @staticmethod 
    def parse(lines): 
     groups = [[]] 
     for line in lines: 
      if line.startswith("("): 
       groups.append([]) 
      groups[-1].append(line) 
     return [Details(g) for g in groups if g] 

print Details.header 
for d in Details.parse(file(sys.argv[1])): 
    print d 

採樣運行

Source IP   Group IP    Incoming Interface Outgoing Interface 
*     224.0.0.50/32  Ethernet1/36   Ethernet1/47, Vlan25, Vlan20 
1.1.1.1/32   224.0.0.50/32  Ethernet1/36   Ethernet1/47, Vlan20, Vlan25 

這不處理不規則數據或接口 的語義但這些都是很容易地添加,如果你知道是什麼你要。

+0

這很棒,但是看起來這是對我的頭腦,我爲此道歉。我如何將我的文件添加到此...? 另外我得到某種錯誤代碼IndexError:列表索引超出範圍,當您在此行發佈的「幹運行」代碼:for Details.parse(file(sys.argv [1])): 謝謝這真是太神奇了...... – gargolek

+0

我將它作爲'$ python test.py sample'運行,其中'test.py'包含程序,'sample'包含示例數據。 – jq170727

+0

再次感謝您的道歉,您必須像我一樣對待新手。 這樣的工作,它讓我的文件中,然後返回下面的錯誤代碼: 回溯(最近通話最後一個): 文件「C:\用戶\ Gargolek \ Multicast_FILE \ Multicast_v4.py 」第47行,在 打印d 文件 「C:\用戶\ Gargolek \ Multicast_FILE \ Multicast_v4.py」,第13行,在__repr__ 返回self._format%自 KeyError異常: '呼出' – gargolek