我正在尝试搜索并匹配cisco路由器配置上的特定字符串,它保存在.txt文件中。这是.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 101,102,103等...'
我想要抓取并保存的部分是每个“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完成它跟随另一个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']
答案 0 :(得分: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)
答案 1 :(得分:0)
我们只使用一个简单的正则表达式来识别“ip sla”后跟数字,而不是字母:
import re
matcher = re.compile( "ip sla [0-9]+" )
这意味着:文字字符串“ip sla”,后跟一组0-9(十进制数字)中的一个或多个字符。
现在,您需要知道的是matcher.match(s)会告诉您字符串s是否与模式匹配。
你不需要做任何其他事情。这样的事情是一种方法:
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" ]