2017-09-29 3 views
0

MAC、アドレス、ポートなどの多くの機能を持っているので、テキストファイルからMACアドレスをフィルタリングしようとしています。以下のようになりますが、LISTの出力は です。空白のリスト行と行があります。TOTAL & MAC削除したい最初のコードで試してみましたが、以下python MACとTOTALの行開始を削除して最初の値またはインデックスを表示する0

#!/usr/bin/env python 
    with open('device', 'r') as fopen: 
     readMac = fopen.read().splitlines() 
     for line in readMac: 
     getMAC = line.upper().split() 
      #if getMAC[0] not in ('TOTAL', 'MAC'): 
     print getMAC 

..コード出力のは、製造..以下

bash-4.1$ ./maclist2.py 
['TOTAL', 'ACTIVE', 'ENTRIES', 'FROM', 'ALL', 'PORTS', '=', '312'] 
['MAC', 'ADDRESS', 'PORT', 'AGE', 'VLAN', 'TYPE'] 
[] 
['0004.5G0B.54DA', '11/40', '0', '174'] 
['24B6.FGG8.05EC', '10/7', '0', '174'] 
['MAC', 'ADDRESS', 'PORT', 'AGE', 'VLAN', 'TYPE'] 
[] 

iはエラーを返し line.startswith関数と、それにしようとした別のコードであります

bash-4.1$ cat maclist.py 
    #!/usr/bin/env python 

    with open('device', 'r') as fopen: 
     for line in fopen.read().splitlines(): 
      if not line.startswith('TOTAL', 'MAC'): 
      print line.upper() 

bash-4.1$ ./maclist.py 
Traceback (most recent call last): 
    File "./maclist.py", line 5, in <module> 
    if not line.startswith('TOTAL', 'MAC'): 
TypeError: slice indices must be integers or None or have an __index__ method 

if not line.startswith('MAC'):だけを使用している場合は、MACで始まる行が削除されますが、別の行にはTOTALがあり、空白行が残ります。

bash-4.1$ cat device | more 
Total active entries from all ports = 312 
MAC Address  Port  Age  VLAN Type 

0004.5G0B.54DA 11/40  0  174 
24B6.FGG8.05EC 10/7  0  174 
MAC Address  Port  Age  VLAN Type 

45B6.FUT8.009C 10/7 0 174

:私はコードわずか if not line.startswith('MAC'):

bash-4.1$ ./maclist.py | more 
TOTAL ACTIVE ENTRIES FROM ALL PORTS = 312 

0004.5G0B.54DA 11/40  0  174 
24B6.FGG8.05EC 10/7  0  174 

45B6.FUT8.009C 10/7  0  174 

ファイルのサンプルを変更すると、それを実行したときに

以下

が出力されます

+0

はあなたが解析しようとしているファイルからサンプルを共有することはできますか? – Kyle

+0

@Kyle ..確かに私は – rockypy17

+0

@Kyle ..ちょうどファイルサンプル – rockypy17

答えて

0

私はそれが良く、さらに可能なら、私に知らせてください.. res.startswith機能を持つ別のと、単にそれを得るためにトリックを持っている...

1)reとの最初のコードstartswith MOとモジュール

#!/usr/bin/python3.6 
import re 
for line in open('device'): 
    line = line.strip() 
    if line != '': 
    if not re.match(r'(Total|MAC)', line): 
     getMac = line[:15] 
     getPort = line[15:20] 
     getSub = line[36:40] 
     #getMAC = line[15:20] 
     print(getMac.upper()) 
     #print(getPort.upper()) 
     #print(getSub.upper()) 

2)は、第2のコードdule

#!/usr/bin/python3.6 
with open("device", "r") as f: 
    for line in f: 
     data = line.strip() 
     if data: # is not empty 
      raw_data2 = data 
      if not raw_data2.startswith(('Total', 'MAC')): 
      getMac = raw_data2[:15] 
      print(getMac.upper()) 
1

私はreモジュールを使用してMACアドレスを照合するのが最も簡単だと思いますesに正規表現を付けます。フォーマットは非常に一貫しているので、それらをすべて解析するもっとも簡単な方法かもしれないと思います。以下は私のサンプルです。質問のサンプルデータセットを使用して、sample_data.txtというファイルに入れています。私は正規表現のウィザードではないけど、これは仕事を得る必要があります:私のソリューションは、[「0004.5G0B.54DA」、「24B6.FGG8.05EC」]

を返します。

import re 


def get_data(): 
    pattern = re.compile(r'[a-z|A-Z|0-9]{4}\.[a-z|A-Z|0-9]{4}\.[a-z|A-Z|0-9]{4}') 
    mac_addresses = None 

    with open('sample_data.txt', 'r') as data_file: 
     raw_data = data_file.read() 
     results = pattern.findall(raw_data) 
     mac_addresses = results 

    return mac_addresses 

if __name__ == '__main__': 
    mac_addresses = get_data() 
    [print(a) for a in mac_addresses] 
+0

私はそれをテストしましょう.. – rockypy17

+0

私はそれを実行したとき、それは出力を返しません。 – rockypy17

+0

出力をsample_data.txtファイルに保存しましたか?例外などはありますか?それは私のシステムで見つけました。 – Kyle

関連する問題