2016-11-10 3 views
0

多くのインタフェースに関連する情報が含まれているファイルがあります。私の例は単純化のために2つしかありません。ファイルを分割すると同様の行が表示される

私はこれを別の変数に分割して、後で使用する必要があります。たとえば、以下のテキストから、値が10.196.135.30のeth1_ip、変数255.0.0.0のeth1_mask、値192.168.4.2のeth2_ipなどの変数を作成したいと考えています。

私は、異なる "分割"と "リードファイル"のシナリオを通過してきましたが、これを釘付けにすることはできませんでした。

私は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

オープンファイルは、文字列の繰り返し可能です。開発のために、あなたの 'iterable of strings'をコードに入れてください。 '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 

私はあなたが"10.196.135.30 Vlan: 0"外のIPを取得してのような追加の解析を行うもらおう。

+0

それは速いアレックスだった。ありがとうございました。私はそれを撃つだろう。 – user3183485

+0

説明を提供しますか? – ppperry

+0

@ppperryそれは説明するコードがたくさんあります。誰かが何かを持っているならば、私はむしろ特定の質問に答えるだろう。私はコードを説明していないので、downvoteをしないでください。 –

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

答えWWIIに感謝します。 – user3183485

+0

@ user3183485、それはあなたが必要とするものに近いですか? – wwii

関連する問題