我有一个由接口名称和访问列表名称组成的元组列表。像这样:
exempt_int_acl_tuple=[('(app)', 'access-list nonat'), ('(app2)', 'access-list nonat')]
要搜索的示例配置是这样的:
config=['access-list nonat extended permit ip 10.0.0.0 255.0.0.0 10.0.0.0 255.0.0.0','access-list nonat extended permit ip 10.0.0.0 255.0.0.0 192.168.15.0 255.255.255.0','access-list nonat extended permit ip 10.0.0.0 255.0.0.0 1.1.1.1 255.255.255.240','blah','blah blah','some more blah']
我有一个列表字符串,我在其中寻找特定的模式。如果列表与模式匹配,我将其添加到名为exempt_acl
的新列表中。
所以我的代码看起来像这样:
exempt_acl=[]
for interface,acl_name in exempt_int_acl_tuple:
for someline in config:
acl_statement=acl_name+' extended permit ip '
if (acl_statement in someline) and (someline not in exempt_acl):
exempt_acl.append(someline)
在这种情况下,重复元组中的访问列表名称,以便搜索配置文件两次。所以exempt_acl看起来像这样:
['access-list nonat extended permit ip 10.0.0.0 255.0.0.0 10.0.0.0 255.0.0.0 ', 'access-list nonat extended permit ip 10.0.0.0 255.0.0.0 192.168.15.0 255.255.255.0 ', 'access-list nonat extended permit ip 10.0.0.0 255.0.0.0 1.1.1.1 255.255.255.240 ']
['access-list nonat extended permit ip 10.0.0.0 255.0.0.0 10.0.0.0 255.0.0.0 ', 'access-list nonat extended permit ip 10.0.0.0 255.0.0.0 192.168.15.0 255.255.255.0 ', 'access-list nonat extended permit ip 10.0.0.0 255.0.0.0 1.1.1.1 255.255.255.240 ']
然而,相同的行被添加两次,并且它创建了一个列表列表,而不是字符串列表。我认为(someline not in exempt_acl)
的布尔值评估会阻止第二次添加行,但确实如此。我究竟做错了什么?我正在使用file.read().splitlines()
来读取配置文件,以防万一。
答案 0 :(得分:1)
假设您有一个名为config.txt
的文件,其中包含以下内容:
access-list nonat extended permit ip 10.0.0.0 255.0.0.0 10.0.0.0 255.0.0.0
access-list nonat extended permit ip 10.0.0.0 255.0.0.0 192.168.15.0 255.255.255.0
access-list nonat extended permit ip 10.0.0.0 255.0.0.0 1.1.1.1 255.255.255.240
test.py
包含此内容:
exempt_acl = [('(app)', 'access-list nonat'),
('(app2)', 'access-list nonat'),
]
results = []
with open('config.txt') as config:
for line in config:
line = line.strip()
for _,acl_name in exempt_acl:
acl_statement = acl_name + ' extended permit ip '
if line.startswith(acl_statement) and line not in results:
results.append(line)
for result in results:
print(result)
如果我理解你的问题,那应该做你正在寻找的事情。
我不确定您在原始代码库中的确切行为 - 您问题中的代码绝对不是MCVE。此代码也按预期工作:
config = [line.strip() for line in open('config.txt')]
results = []
for _, acl_name in exempt_acl:
for line in config:
acl_statement = acl_name + ' extended permit ip '
if acl_statement in line and line not in results:
results.append(line)
for result in results:
print(result)
答案 1 :(得分:1)
首先,list
ify someline
说someline = someline[0]
。
如果行似乎仍然附加两次,则可能归结为条件if (acl_statement in someline)
的模糊性。如果两行略有不同(例如,不同数量的空白),但包含相同的acl_statement
,则两者都将被追加。
答案 2 :(得分:0)
我找到了为什么配置打印两次的答案。
Main正在调用该函数两次。一旦错误(不将函数输出映射到值,但执行调试中涉及的打印),并且一次正确,因此不会影响输出。
感谢所有协助的人。我非常感谢你的帮助,我也学到了一些东西!对我来说最重要的一课是在将来发布之前制定MCVE。