2016-08-08 15 views
1

私は、エクスポートされたデータから特定の "mroute"(マルチキャストルート)をスクリプト化しようとしているネットワークエンジニアです。私はこれを行うための最も "ピジョン"の道を理解しようとしています。マルチルートを解析する "Python"の方法

データは、この(私のネットワークに固有の何も、ちょうどラボ輸出)のようになります。

 
(*,224.0.0.0/4) RPF nbr: 96.34.35.36 Flags: C RPF P 
    Up: 1w5d 

(*,224.0.0.0/24) Flags: D P 
    Up: 1w5d 

(*,224.0.1.39) Flags: S P 
    Up: 1w5d 

(96.34.246.55,224.0.1.39) RPF nbr: 96.34.35.36 Flags: RPF 
    Up: 1w4d 
    Incoming Interface List 
    Bundle-Ether434 Flags: F A, Up: 1w4d 
    Outgoing Interface List 
    BVI100 Flags: F, Up: 1w4d 
    TenGigE0/0/0/3 Flags: F, Up: 1w4d 
    TenGigE0/0/1/1 Flags: F, Up: 1w4d 
    TenGigE0/0/1/2 Flags: F, Up: 1w4d 
    TenGigE0/0/1/3 Flags: F, Up: 1w4d 
    TenGigE0/1/1/1 Flags: F, Up: 1w4d 
    TenGigE0/1/1/2 Flags: F, Up: 1w4d 
    TenGigE0/2/1/0 Flags: F, Up: 1w4d 
    TenGigE0/2/1/1 Flags: F, Up: 1w4d 
    TenGigE0/2/1/2 Flags: F, Up: 1w4d 
    Bundle-Ether234 (0/3/CPU0) Flags: F, Up: 2d17h 
    Bundle-Ether434 Flags: F A, Up: 1w4d 

(*,224.0.1.40) Flags: S P 
    Up: 1w5d 
    Outgoing Interface List 
    TenGigE0/2/1/0 Flags: II, Up: 1w5d 

私は特定の行はRegexときループは、インデックスのインクリメンタを上に移動するためにCスタイルを複製しようとしています。

「送信」セクションに特定の出力がある場合にのみ、マルチキャストグループを表示したいだけです。

私がこれまで試してみました何の恐ろしい例としては、(完全ではない、データがリストに渡される):任意のアドバイスを

myarray = [] 
myarray = output.split("\n") 

max_count = len(myarray) 
i= 0 
while (i < max_count): 
    if (re.match(r"(^\()", myarray[i])): 
     group = myarray[i] 
     print group 
     i+=1 
     while (re.match(r'(?!^\()', myarray[i])): 
      if (re.match(r" Outgoing Interface List", myarray[i])): 
       outgoing = myarray[i] 
       print outgoing 
       i+=1 
       while (re.match(r'(?!^\()', myarray[i])): 
        print myarray[i] 
        i+=1 
      else: 
       i+=1 
    else: 
     i+=1 

感謝を。

+0

"was"はタイトルの "way"であるべきですか? –

+0

うん、修正しました、ありがとう! –

+0

これはうまくいきますが、もっとPythonの方法でやりたいのですか?おそらくこれは[codereview.SE](http://codereview.stackexchange.com/)にあるはずですか? –

答えて

1

forループを使用すると、ループ中にシーケンス番号を返すので、変数カウンタを使用する必要がなくなります。

おそらくもっと簡単な方法もありますが、同じ結果が得られることを願っています。

myarray = output.split("\n") 

for i in range(len(myarray)): 
    if re.match('(^\()', myarray[i]): 
     group = myarray[i] 
     print group 
     if (re.match('(?!^\()', myarray[i])): 
      if re.match('\s+Outgoing Interface List', myarray[i]): 
       outgoing = myarray[i] 
       print outgoing 
       if re.match('(?!^\()', myarray[i]): 
        print myarray[i] 

私の結果は以下の通りであった。

(*,224.0.0.0/4) 
(*,224.0.0.0/24) 
(*,224.0.1.39) 
(96.34.246.55,224.0.1.39) 
(0/3/CPU0) 
(*,224.0.1.40) 
+0

返信Jclarkeに感謝しますが、問題は私がグループに特定の結果を持っている場合にのみ表示したいことです。 "(^ \()"、myarray [i])):continue'。それで私はwhileループのカスタム "リスト"インデックスを用意していたのです。 –

0

それはより多くのニシキヘビがあるが、私はイテレータ/発電機の代わりに、直接配列インデックスを使用することを好むことをわかりません。

import re 

def print_out_ifaces(group, iterator): 
    """ 
     function print output interfaces with its group (ip) 
      It uses fact that you have empty line between 2 groups 
    """ 
    for iface_list in iterator: 
     iface_list = iface_list.rstrip() #remove tail \n 
     if not iface_list: 
      return 

     if not re.match(r" *Outgoing Interface List", iface_list): 
      continue 

     print "group is " + group.rstrip() 
     print iface_list # will print "Outgoing Interface List" 
     for iface in iterator: 
      iface = iface.rstrip(); #remove tail \n 
      if not iface: 
       print # add additional empty line beween 2 groups 
       return 
      print iface 

output = open('routes', 'r'); # i saved your routes example in file "routes" 

#if your "output" is string with routes 
#then after "split('\n')" run "iter(myarray)" 

for line in output: 
    if line.startswith("("): # startswith much faster then checking first symbol by re 
     group = line; 
     print_out_ifaces(group, output) 

また、それは(PyparsingまたはPLYのような)の解析のための特別なツールを使用することは可能だが、私はそれがこの仕事のために行き過ぎになると思います。

+0

ありがとうArnial。イテレータ/ジェネレータを読んで、それを動作させることができるかどうかを見ています。 "funtion /メソッドが組み込まれているので、それも使えるかもしれません。 –

関連する問題