0

.txt ファイルに保存されている cisco ルーター構成で特定の文字列を検索して一致させようとしています。これは、.txt ファイルの一部の例です。

ip sla 101
udp-jitter 10.0.0.1 48092
request-data-size 64
tos 100
tag hostname
frequency 300
ip sla schedule 101 life forever start-time now
ip sla 102
udp-jitter 10.0.26.36 48092
request-data-size 64
tos 100
owner owner
tag hostname
frequency 300
ip sla schedule 102 life forever start-time now
ip sla 103
udp-jitter 10.0.114.1 48092
tos 100
vrf mskjhhj
owner owner2
tag hostname
ip sla schedule 103 life forever start-time now

したがって、500 の .txt ファイルがあり、すべての構成にさまざまなバリエーションがあると想像してください。

取得して保存したい部分は、各「IP SLA」の下の構成です。たとえば、最初の行は「ip sla 101」であり、その構成全体は次のようになります。

ip sla 101
udp-jitter 10.0.0.1 48092
request-data-size 64
tos 100
tag xb02wepr01-004108
frequency 300
ip sla schedule 101 life forever start-time now

ファイル全体を検索して、「ip sla」のそれぞれの情報を取得できるようにしたいのですが、一部のファイルの構成が異なることを覚えておいてください。唯一同じなのは、ip sla の 1 つが最後に、それがなくなるまで、別の ip sla が続きます。シスコの設定なので、自分で説明するかどうかはわかりません。

これは私のコードです:

f =open('config.txt')
f =f.readlines()
f_out =open('save_result.txt', 'wb')
for i in f:
    if 'ip sla <any number>:
        ipsla<number>=[]
        ipsla<number>.append(i)
        ipslacurrent = i
    elif i != <any number>:
        ipsla<number>.append(i)
    f_out.write(ipsla<anynumber>)
f_out.close()

これがすべて理にかなっていることを願っています。これを達成する他の方法があれば、私は感謝します。おそらく正規表現ですが、rgexの経験はありません。ありがとう

アップデート:

私が基本的に欲しいのは、複数の変数です。スクリプトの最後に、次の例のようにスクリプトを収集します。

例:

ip_sla_101 =['udp-jitter 10.0.0.1 48092', 'request-data-size 64','tos 100','tag hostname','frequency 300','ip sla schedule 101 life forever start-time now']

ip_sla_102 =['udp-jitter 10.0.26.36 48092', 'request-data-size 64','tos 100','owner owner', 'tag hostname','frequency 300','ip sla schedule 102 life forever start-time now']

ip_sla_103 =['udp-jitter 10.0.114.1 48092','tos 100','owner owner2', 'tag hostname', 'ip sla schedule 103 life forever start-time now']
4

2 に答える 2

0

あなたが何を望んでいるのかよくわかりませんが、行全体を取得したいと思います。その場合、次のことができます。

with open('outfile.txt','w') as out_file:
    with open('infile.txt','r') as in_file:
        for line in in_file:
            if 'ip sla' in line:
                out_file.write(line)
于 2013-03-11T23:52:26.263 に答える
0

「ip sla」の後に数字が続くが文字は認識されない単純な正規表現を 1 つだけ使用します。

import re
matcher = re.compile( "ip sla [0-9]+" )

これは、リテラル文字列 "ip sla " の後に、0 ~ 9 (10 進数) の 1 つまたは複数の文字が続くことを意味します。

ここで知っておく必要があるのは、文字列 s がパターンに一致するかどうかを matcher.match( s ) が教えてくれるということだけです。

残りは特別なことをする必要はありません。このようなことは、それを行う1つの方法です。

collected = {} # a dictionary of first-lines to list-of-lines
current = []
for line in f.readlines():
    if matcher.match( line ): #this will match the line
        # we're starting a new section
        if current: # is there anything in the old section?
            collected[ current[0] ] = current # organize by first line
        current = [ line ] # start a new list for the new section
    else:
        current.append( line )
print collected[ "ip sla 101" ]
于 2013-03-11T23:53:27.010 に答える