2013-06-14 4 views
1

ifconfig를 구문 분석하여 IP 주소가 할당 된 VLAN 만 남겨두고 싶습니다. 각 VLAN, 인터페이스 이름, IP 주소 및 MAC 주소 (변환 된 형식의 Mac)에서 다음 데이터를 원합니다. 이들은 목록의 목록에 저장되어야합니다. 각 VLAN에 대한 목록입니다.목록으로 ifconfig 구문 분석

지금까지 각 VLAN에 대해 IP 및 인터페이스 이름으로 하나의 목록을 만들었습니다. 그러나 나는 궤도에서 벗어나서 나쁜 생각으로 어떤 제안을하고 있다고 느낍니까?

원하는 출력 :

[['vlan1', '192.168.2.2', '0013.F200.0058'], ['vlan100', '192.168.110.2','0013.F200.0058'], ['vlan20', '192.168.30.2','0013.F200.0058']] 

전류 출력 :

['vlan1', '0013.F200.0058', '192.168.2.2', 'vlan100', '0013.F200.0058', '192.168.110.2', 'vlan20', '0013.F200.0058', '192.168.30.2'] 

내가 쉽게 중첩 된 목록으로이 단순 목록을 설정할 수 있습니다 알고 있지만, 나는 그것이이 전 단계에서 수행해야합니다 생각합니다.

EG는하지만이 나쁜 생각 :

i=0 
new_list=[] 
while i<len(data_list): 
    new_list.append(data_list[i:i+3]) 
    i+=3 

코드 :

import re 
a = """ 

vlan1  Link encap:Ethernet HWaddr 00:13:F2:00:00:58 
      inet addr:192.168.2.2 Bcast:192.168.2.255 Mask:255.255.255.0 
      UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 
      RX packets:39 errors:0 dropped:0 overruns:0 frame:0 
      TX packets:2708 errors:0 dropped:0 overruns:0 carrier:0 
      collisions:0 txqueuelen:0 
      RX bytes:2188 (2.1 KiB) TX bytes:383156 (374.1 KiB) 

vlan100 Link encap:Ethernet HWaddr 00:13:F2:00:00:58 
      inet addr:192.168.110.2 Bcast:192.168.110.255 Mask:255.255.255.0 
      UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 
      RX packets:2 errors:0 dropped:0 overruns:0 frame:0 
      TX packets:2683 errors:0 dropped:0 overruns:0 carrier:0 
      collisions:0 txqueuelen:0 
      RX bytes:100 (100.0 B) TX bytes:375620 (366.8 KiB) 

vlan2  Link encap:Ethernet HWaddr 00:13:F2:00:00:58 
      UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 
      RX packets:0 errors:0 dropped:0 overruns:0 frame:0 
      TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 
      collisions:0 txqueuelen:0 
      RX bytes:0 (0.0 B) TX bytes:0 (0.0 B) 

vlan20 Link encap:Ethernet HWaddr 00:13:F2:00:00:58 
      inet addr:192.168.30.2 Bcast:192.168.30.255 Mask:255.255.255.0 
      UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 
      RX packets:17274 errors:0 dropped:0 overruns:0 frame:0 
      TX packets:16376 errors:0 dropped:0 overruns:0 carrier:0 
      collisions:0 txqueuelen:0 
      RX bytes:4389760 (4.1 MiB) TX bytes:3112376 (2.9 MiB) 
""" 

    for paragraph in a.split('\n\n'): 

    #mac = re.search(r'HWaddr\s+(\S+)', paragraph) 
    #c.append(mac.group(1)) 
    if "vlan" in paragraph and "inet addr:" in paragraph: 
     b= [] 
     b.append(paragraph.split()) 
     for i in b[0]:  
      if "addr:" in i: 
       ip = re.search(r'addr:(\S+)', i) 
       c.append(ip.group(1)) 
      if "vlan" in i: 
       c.append(i) 
      if re.search(r'\d\d:\d\d:(\S+)', i): 
       it = iter(i.split(':')) 
       i = ".".join(x+y for x,y in zip(it,it)) 
       c.append(i) 
    print c 
+0

왜 안'grep','regexp'? –

+0

왜 목록 목록이 필요합니까? 목록을 작성하는 것이 더 낫지 않습니까? dict의 핵심은 vlan의 이름이고 모든 목록에는 mac 및 ip가 포함됩니다. – Wookie88

+0

@ Wookie88 기본적으로 각 목록을 표 형식으로 인쇄하고 목록을 사용하는 데 익숙합니다. 길이와 데이터가 다양하기 때문에 색인을 참조하는 것이 쉽습니다. 오픈 아무것도 사용합니다. – Paul

답변

6
import re 
a = """ 

vlan1  Link encap:Ethernet HWaddr 00:13:F2:00:00:58 
      inet addr:192.168.2.2 Bcast:192.168.2.255 Mask:255.255.255.0 
      UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 
      RX packets:39 errors:0 dropped:0 overruns:0 frame:0 
      TX packets:2708 errors:0 dropped:0 overruns:0 carrier:0 
      collisions:0 txqueuelen:0 
      RX bytes:2188 (2.1 KiB) TX bytes:383156 (374.1 KiB) 

vlan100 Link encap:Ethernet HWaddr 00:13:F2:00:00:58 
      inet addr:192.168.110.2 Bcast:192.168.110.255 Mask:255.255.255.0 
      UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 
      RX packets:2 errors:0 dropped:0 overruns:0 frame:0 
      TX packets:2683 errors:0 dropped:0 overruns:0 carrier:0 
      collisions:0 txqueuelen:0 
      RX bytes:100 (100.0 B) TX bytes:375620 (366.8 KiB) 

vlan2  Link encap:Ethernet HWaddr 00:13:F2:00:00:58 
      UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 
      RX packets:0 errors:0 dropped:0 overruns:0 frame:0 
      TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 
      collisions:0 txqueuelen:0 
      RX bytes:0 (0.0 B) TX bytes:0 (0.0 B) 

vlan20 Link encap:Ethernet HWaddr 00:13:F2:00:00:58 
      inet addr:192.168.30.2 Bcast:192.168.30.255 Mask:255.255.255.0 
      UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 
      RX packets:17274 errors:0 dropped:0 overruns:0 frame:0 
      TX packets:16376 errors:0 dropped:0 overruns:0 carrier:0 
      collisions:0 txqueuelen:0 
      RX bytes:4389760 (4.1 MiB) TX bytes:3112376 (2.9 MiB) 
""" 

c = [] 
for paragraph in a.split('\n\n'): 

    ma = re.compile("(vlan\d+).*HWaddr ([^ ]+).*addr:([^ ]+)", re.MULTILINE|re.DOTALL) 

    result = ma.match(paragraph) 

    if result != None: 
     vlan = result.group(1) 
     mac = result.group(2) 
     ip = result.group(3) 

     m = mac.split(':') 
     mac = m[0] + m[1] + "." + m[2] + m[3] + "." + m[4] + m[5] 

     #print "vlan:", vlan 
     #print "ip:",ip 
     #print "mac:", mac 

     c.append([vlan, ip, mac]) 

print c 

결과 :

[['vlan1', '192.168.2.2', '0013.F200.0058'], ['vlan100', '192.168.110.2', '0013.F200.0058'], ['vlan20', '192.168.30.2', '0013.F200.0058']] 
관련 문제