2

私は Python 3 を使用しています。2 つのプログラムを作成しました。csv ファイルをループして Cisco スイッチの IP アドレスを取得し、ログインしてコマンドを実行し、それぞれの結果を個々のテキスト ファイルに出力します。そのため、スイッチごとに 1 つずつ、多数のテキスト ファイルが作成されます。2 番目のプログラムは、xlwt を使用して、各テキスト ファイルの情報を Excel の独自のシートに書き込みます。

主なアイデアは、ポートが稼働中または稼働していないことを示すレポートを作成する必要があるということです。これらを Excel にインポートしたら、必要なデータを抽出する数式を記述できます。しかし、これを Excel にインポートすると、現在のところ、一部のセルを手動で削除する必要があります。これは、名前列のいくつかの単語の間にスペースがあるためです (Excel にインポートしています)。スペース区切り)。文字列とリストのメソッド (分割、結合、スライスなど) を使用していくつかのことを試みましたが、必要なものを正確に取得できません。また、Name 列は、どのような種類の一貫した規則でも標準化されていません。名前は実際には非常に長いかもしれませんが、特定の文字数に切り捨てられることに気付きました。

理想的には、最初の 4 行 (最上部に空白行があります) と最後の行を最初に削除してから、ポートとステータスの間のすべてを削除します (ヘッダーを含む列を完全に削除します)。

これは、スイッチからデータを取得した後のファイルの外観です。

sw1#期間の長さ 0
sw1#show インターフェイス ステータス

ポート名 ステータス VLAN デュプレックス スピード タイプ
Gi0/1 トランクからスイッチ (a 接続 1 a-full a-100 10/100/1000BaseTX
Gi0/2 ネットワーク拡張 pe 接続済み 1 a-full a-1000 10/100/1000BaseTX
Gi0/3 接続 1 a-full a-1000 10/100/1000BaseTX
Gi0/4 接続 1 a-full a-100 10/100/1000BaseTX
Gi0/5 notconnect 1 auto auto Not Present
Gi0/6 notconnect 1 auto auto Not Present
Gi0/7 notconnect 1 auto auto Not Present
Gi0/8 notconnect 1 auto auto Not Present
Gi0/9 notconnect 1 auto auto Not Present
Gi0/10 接続 1 a-full a-100 10/100/1000BaseTX
Gi0/11 notconnect 1 auto auto Not Present
Gi0/12 接続 1 a-full a-100 10/100/1000BaseTX
Gi0/13 無効 1 自動 自動 存在しない
Gi0/14 無効 1 自動 自動 存在しない
Gi0/15 無効 1 自動 自動 存在しない
Gi0/16 無効 1 自動 自動 存在しない
sw1#ログアウト

最終結果は以下のとおりです。これにより、Excel にインポートするときに、行/列の構造が損なわれないようにする必要があります。すべての列情報がスペースで区切られていることに注意してください。固定幅としてインポートするか、連続したスペースをチェックされたものとして扱うスペースで区切ってインポートすると、かなりうまくいくようです。

ポート ステータス VLAN デュプレックス スピード タイプ
Gi0/1 接続 1 a-full a-100 10/100/1000BaseTX
Gi0/2 接続 1 a-full a-1000 10/100/1000BaseTX
Gi0/3 接続 1 a-full a-1000 10/100/1000BaseTX
Gi0/4 接続 1 a-full a-100 10/100/1000BaseTX
Gi0/5 notconnect 1 auto auto Not Present
Gi0/6 notconnect 1 auto auto Not Present
Gi0/7 notconnect 1 auto auto Not Present
Gi0/8 notconnect 1 auto auto Not Present
Gi0/9 notconnect 1 auto auto Not Present
Gi0/10 接続 1 a-full a-100 10/100/1000BaseTX
Gi0/11 notconnect 1 auto auto Not Present
Gi0/12 接続 1 a-full a-100 10/100/1000BaseTX
Gi0/13 無効 1 自動 自動 存在しない
Gi0/14 無効 1 自動 自動 存在しない
Gi0/15 無効 1 自動 自動 存在しない
Gi0/16 無効 1 自動 自動 存在しない

任意のポインタをいただければ幸いです。正規表現が適切であると考えていますが、それを構築する方法について少し支援が必要です。これがあいまいではないことを願っています。

以前の更新を削除し、新しいスレッドに移動しました

4

4 に答える 4

1

最初の 3 行をスキップしました。

sw1#term length 0
sw1#show interfaces status

プログラム:

with open('in.txt') as f,open('out.txt','w') as out:
   line1=f.readline()
   ind1=line1.find('Name')
   ind2=line1.find('Status')
   x=line1.split()
   x.remove('Name')
   y="%-13s %-15s %-6s %-7s %-8s %-s"%(x[0],x[1],x[2],x[3],x[4],x[5])
   out.write(y+'\n')
   for x in f:
       x=x[:ind1]+x[ind2:]
       x=x.split()
       y="%-13s %-15s %-6s %-7s %-8s %-s"%(x[0],x[1],x[2],x[3],x[4],x[5])
       out.write(y+'\n')


Port          Status          Vlan   Duplex  Speed    Type
Gi0/1         connected       1      a-full  a-100    10/100/1000BaseTX
Gi0/2         connected       1      a-full  a-1000   10/100/1000BaseTX
Gi0/3         connected       1      a-full  a-1000   10/100/1000BaseTX
Gi0/4         connected       1      a-full  a-100    10/100/1000BaseTX
Gi0/5         notconnect      1      auto    auto     Not
Gi0/6         notconnect      1      auto    auto     Not
Gi0/7         notconnect      1      auto    auto     Not
Gi0/8         notconnect      1      auto    auto     Not
Gi0/9         notconnect      1      auto    auto     Not
Gi0/10        connected       1      a-full  a-100    10/100/1000BaseTX
Gi0/11        notconnect      1      auto    auto     Not
Gi0/12        connected       1      a-full  a-100    10/100/1000BaseTX
Gi0/13        disabled        1      auto    auto     Not
Gi0/14        disabled        1      auto    auto     Not
Gi0/15        disabled        1      auto    auto     Not
Gi0/16        disabled        1      auto    auto     Not
于 2012-05-12T22:04:37.240 に答える
1

まず、以下のコードは name-column を削除します。そこから取り出して、素敵な csv プリントアウトを追加します。ヒント:column[-1]は最後のエントリで、最後からcolumn[-2]2 番目です。文字列が存在する場合、これらを結合しますNot...

#!/usr/bin/env python

tokens = ['connected', 'notconnect', 'disabled']

with open('text') as fd:
    for line in fd:
        line = line.strip().split()

        connection = [line[0]]
        found = False

        for i in line:
            if i in tokens:
                found = True
            if found:
                connection.append(i)

        print connection

出力:

['Gi0/1', 'connected', '1', 'a-full', 'a-100', '10/100/1000BaseTX']
['Gi0/2', 'connected', '1', 'a-full', 'a-1000', '10/100/1000BaseTX']
['Gi0/3', 'connected', '1', 'a-full', 'a-1000', '10/100/1000BaseTX']
['Gi0/4', 'connected', '1', 'a-full', 'a-100', '10/100/1000BaseTX']
['Gi0/5', 'notconnect', '1', 'auto', 'auto', 'Not', 'Present']
['Gi0/6', 'notconnect', '1', 'auto', 'auto', 'Not', 'Present']
['Gi0/7', 'notconnect', '1', 'auto', 'auto', 'Not', 'Present']
['Gi0/8', 'notconnect', '1', 'auto', 'auto', 'Not', 'Present']
['Gi0/9', 'notconnect', '1', 'auto', 'auto', 'Not', 'Present']
['Gi0/10', 'connected', '1', 'a-full', 'a-100', '10/100/1000BaseTX']
['Gi0/11', 'notconnect', '1', 'auto', 'auto', 'Not', 'Present']
['Gi0/12', 'connected', '1', 'a-full', 'a-100', '10/100/1000BaseTX']
['Gi0/13', 'disabled', '1', 'auto', 'auto', 'Not', 'Present']
['Gi0/14', 'disabled', '1', 'auto', 'auto', 'Not', 'Present']
['Gi0/15', 'disabled', '1', 'auto', 'auto', 'Not', 'Present']
['Gi0/16', 'disabled', '1', 'auto', 'auto', 'Not', 'Present']

コメント後の更新:

これは、KISSの原則を使用して行う方法です。

#!/usr/bin/env python

import sys

tokens = ['connected', 'notconnect', 'disabled']

with open('text') as fd:
    for line in fd:
        line = line.strip().split()

        connection = [line[0]]
        found = False

        for i in line:
            if i in tokens:
                found = True
            if found:
                connection.append(i)

        if 'Not' in connection and 'Present' in connection:
            # Remove last 2 entries
            connection.pop() ; connection.pop()
            connection.append('Not Present')

        print connection

出力:

['Gi0/1', 'connected', '1', 'a-full', 'a-100', '10/100/1000BaseTX']
['Gi0/2', 'connected', '1', 'a-full', 'a-1000', '10/100/1000BaseTX']
['Gi0/3', 'connected', '1', 'a-full', 'a-1000', '10/100/1000BaseTX']
['Gi0/4', 'connected', '1', 'a-full', 'a-100', '10/100/1000BaseTX']
['Gi0/5', 'notconnect', '1', 'auto', 'auto', 'Not Present']
['Gi0/6', 'notconnect', '1', 'auto', 'auto', 'Not Present']
['Gi0/7', 'notconnect', '1', 'auto', 'auto', 'Not Present']
['Gi0/8', 'notconnect', '1', 'auto', 'auto', 'Not Present']
['Gi0/9', 'notconnect', '1', 'auto', 'auto', 'Not Present']
['Gi0/10', 'connected', '1', 'a-full', 'a-100', '10/100/1000BaseTX']
['Gi0/11', 'notconnect', '1', 'auto', 'auto', 'Not Present']
['Gi0/12', 'connected', '1', 'a-full', 'a-100', '10/100/1000BaseTX']
['Gi0/13', 'disabled', '1', 'auto', 'auto', 'Not Present']
['Gi0/14', 'disabled', '1', 'auto', 'auto', 'Not Present']
['Gi0/15', 'disabled', '1', 'auto', 'auto', 'Not Present']
['Gi0/16', 'disabled', '1', 'auto', 'auto', 'Not Present']
于 2012-05-12T21:41:03.377 に答える
1
with open('file') as f:
    lines = f.readlines()
    lines = lines[-1:] + lines[2:-1]
    for line in lines:
        print line[0:11] + line[35:-1]

私はそれがあなたが望むことを大まかにすると思います; 私は自分で実行していないので、数字で少し遊ぶ必要があるかもしれません。使用するのは、リスト (または文字列) のインデックス付けだけです。

  • list[x:] は x 以降のすべてのエントリです
  • list[x:y] は x から y までのすべてのエントリです
  • list[-x] は末尾から x 行目

thelines[-1:] + lines[2:-1]は最後の行を最初に置き、最初の 2 行を破棄します。line[0:11] + line[35:-1]不要な部分と最後の改行を除外します。

stdout の代わりに新しいファイルに書き込みたい場合は更新します。

with open('infile') as in:
    with open('outfile', 'w') as out:
        lines = in.readlines()
        ...
            print(line[0:6] + line[28:-1], file=out)

実際、readlines は一度にすべてを読み取るため、次のようにできます。

with open('infile') as in:
    lines = in.readlines()
with open('outfile', 'w') as out:
    for line in lines:
        ....
        print(line[0:6] + line[28:-1], file=out)

入力ファイルを開く必要がないためです (with終了すると閉じられます)。

于 2012-05-12T21:44:37.367 に答える
0

最初の値と最後の 5 つの値を取り、型が存在しない場合は少し大文字と小文字を切り替えます。

print "{:10} {:15} {:5} {:6} {:6} {}".format("port", "status", "vlan", "duplex", "speed", "type")
with open(my_filename) as logfile:
    content = logfile.read()
    for line in content.splitlines()[4:]:
        port = line.split()[0]
        if line.strip().endswith("Not Present"):
            itype = "Not Present"
            status, vlan, duplex, speed = line.split()[-6:-2]
        else:
            status, vlan, duplex, speed, itype = line.split()[-5:]
        print "{:10} {:15} {:5} {:6} {:6} {}".format(port, status, vlan, duplex, speed, itype)

収量:

port       status          vlan  duplex speed  type            
Gi0/1      connected       1     a-full a-100  10/100/1000BaseTX
Gi0/2      connected       1     a-full a-1000 10/100/1000BaseTX
Gi0/3      connected       1     a-full a-1000 10/100/1000BaseTX
Gi0/4      connected       1     a-full a-100  10/100/1000BaseTX
Gi0/5      notconnect      1     auto   auto   Not Present
Gi0/6      notconnect      1     auto   auto   Not Present
Gi0/7      notconnect      1     auto   auto   Not Present
Gi0/8      notconnect      1     auto   auto   Not Present
Gi0/9      notconnect      1     auto   auto   Not Present
Gi0/10     connected       1     a-full a-100  10/100/1000BaseTX
Gi0/11     notconnect      1     auto   auto   Not Present
Gi0/12     connected       1     a-full a-100  10/100/1000BaseTX
Gi0/13     disabled        1     auto   auto   Not Present
Gi0/14     disabled        1     auto   auto   Not Present
Gi0/15     disabled        1     auto   auto   Not Present
Gi0/16     disabled        1     auto   auto   Not Present
于 2012-05-12T21:42:18.443 に答える