2016-11-10 66 views
0

我有一個包含與多種接口信息的文件。我的例子只有兩個簡單。分割文件中包含類似行

我需要能夠拆分此成我打算以後使用不同的變量。例如,從下面的文本中我想創建一個名爲eth1_ip的變量,其值爲10.196.135.30,eth1_mask的變量爲255.0.0.0,eth2_ip的值爲192.168.4.2等。

I'我一直在經歷不同的「分裂」和「讀取文件」情況,但一直未能指出這一點。

我是新來的Python和任何提示,將不勝感激。謝謝。

eth1: 
    Flags: (0x1043) UP BROADCAST MULTICAST TRAILERS ARP RUNNING 
    Type: GIGABIT_ETHERNET 
    inet is: 10.196.135.30 Vlan: 0 
    Netmask: 255.0.0.0 
    Ethernet address is 00:08:25:21:f8:a0 
    Metric is 0: 
    Maximum Transfer Unit size is 1500  

eth2: 
    Flags: (0x1003) UP BROADCAST MULTICAST TRAILERS ARP 
    Type: UNKNOWN_TYPE 
    inet is: 192.168.4.2 Vlan: 0 
    Ethernet address is 00:08:25:21:f8:a1 
    Metric is 0: 
    Maximum Transfer Unit size is 1500 

我第一次嘗試的想法包括像這樣的:

#!/usr/bin/python 

import re, os, sys, fnmatch 
import telnetlib 
import sys 
import time 
import difflib 
import shutil 


def gleen_macs(): 
    text = open('show_interfaces.txt', 'r') 
    for line in text.readlines(): 
     #print line 
     if re.match('( Ethernet address)(.*)', line): 
      values = line.split('is') 
      print values[1] 

def menu(): 
    get_macs() 

menu() 

我專注於MAC第一。我可以分割它們,但不能按照我的意願將它們分配給一個變量。 (「get_macs()」函數就是我用來生成文件的telnetlib位,這是按我希望的方式工作的,不包括在這裏)。

+2

你可以發佈你這個問題第一次嘗試? –

+0

打開的文件是字符串的迭代。爲了開發,在代碼中放置'可迭代的字符串'。 'file =「」「eth1:<保留行,換行>」「」。splitlines()'。 '文件現在是一個字符串列表(可迭代的)。任何使用'file'發佈的代碼都可以在其他計算機上覆制和測試。現在繼續。 –

+0

文件結構是否與您爲所有*記錄*顯示的一樣? 「 – wwii

回答

-1
with open('interfaces.txt') as infile: 
    # Each interface must be separated by a blank line as in the sample 
    interfaces = infile.read().split('\n\n') 

interfaces = map(str.splitlines, interfaces) 
interfaces = {lines[0][:-1]: [line.strip() for line in lines[1:]] 
       for lines in interfaces} 


def interface_value(interface_name, line_prefix): 
    # Make this argument case-insensitive to make the function easier to use 
    line_prefix = line_prefix.lower() 
    lines = [line for line in interfaces[interface_name] 
      if line.lower().startswith(line_prefix)] 
    if len(lines) == 0: 
     raise ValueError('No lines found with given prefix') 
    if len(lines) > 1: 
     raise ValueError('Multiple lines found with given prefix: \n %s' % lines) 
    return lines[0][len(line_prefix):].strip(': ') 


eth1_flags = interface_value('eth1', 'flags') 
eth2_mtu = interface_value('eth2', 'Maximum Transfer Unit size is') 

print(eth1_flags) 
print(eth2_mtu) 

輸出:

(0x1043) UP BROADCAST MULTICAST TRAILERS ARP RUNNING 
1500 

我就讓你不喜歡獲得IP出"10.196.135.30 Vlan: 0"額外的解析。

+0

亞歷克斯快。謝謝。我會給它一個鏡頭。 – user3183485

+0

提供解釋? – ppperry

+0

@ppperry這是很多代碼來解釋。如果有人有任何問題,我寧願回答具體的問題。請不要因爲我沒有解釋過代碼而失望。 –

0

通過文件只是一步,尋找關鍵字中的每一行,如果線路有你需要提取出來,保存在一個字典的東西,

results = dict() 
with open('eth.txt') as f: 
    for line in f: 
     line = line.strip() 
     if line.endswith(':') and not line.startswith('Metric'): 
      eth = line[:-1] 
     elif line.startswith('inet'): 
      line = line.split(':') 
      ip, _ = line[1].split() 
      results[eth + '_ip'] = ip 
     elif line.startswith('Netmask'): 
      _, mask = line.split(':') 
      mask = mask.strip() 
      results[eth + '_mask'] = mask 

>>> results 
{'eth2_ip': '192.168.4.2', 'eth1_ip': '10.196.135.30', 'eth1_mask': '255.0.0.0'} 
>>> 
+0

感謝第二次世界大戰的回答。 – user3183485

+0

@ user3183485,它接近你所需要的嗎? – wwii