[英]How to parse vlan brief output (cisco)
我正在从IOS思科交换机中检索数据。 输出如下:
VLAN Name Status Ports
---- -------------------------------- --------- -------------------------------
1 default active Gi1/0/3, Gi1/0/4, Gi1/0/5
10 ADMIN_SWT active
11 ADMIN_WIFI active Gi1/0/31, Gi1/0/45, Gi1/0/46
12 ADMIN_SRV-DATA active
想法是将此输出解析为CSV文件。 你有什么想法吗?
您可以解析Mylist
每个条目并将其全部添加到Pandas DataFrame。
这是我的解决方案:
import pandas as pd
Mylist = ['VLAN Name Status Ports', '1 default active Gi1/0/3, Gi1/0/4, Gi1/0/5, Gi1/0/6, Gi1/0/7, Gi1/0/8, Gi1/0/9, Gi1/0/10, Gi1/0/11, Gi1/0/12, Gi1/0/17, Gi1/0/19, Gi1/0/21, Gi1/0/22, Gi1/0/24, Gi1/0/30, Gi1/0/32, Gi1/0/42, Gi1/0/51, Gi1/0/52', '10 ADMIN_SWT active ', '11 ADMIN_WIFI']
results = []
ports_list = []
output_list = []
# save the headers
headers = Mylist.pop(0).split(" ")
# convert string to list of lists
for l in Mylist:
for k in l.split(" "):
# if this is a port add all the port to one cell
if '/' in k:
ports_list.append(k)
else:
output_list.append(k)
output_list.append(' '.join(ports_list))
results.append(output_list)
# clear the temp lists
output_list = []
ports_list = []
# make sure every sublist has only number of elements in headers length
for item in results:
if len(item) < len(headers):
item.append("")
elif len(item) > len(headers):
# remove all the unnecessary elements
del item[len(headers)-1:-1]
df = pd.DataFrame(results, columns = headers)
df.to_csv('out.csv')
根据您的Mylist示例,结果如下:
VLAN Name Status Ports
0 1 default active Gi1/0/3, Gi1/0/4, Gi1/0/5, Gi1/0/6, Gi1/0/7, G...
1 10 ADMIN_SWT active
2 11 ADMIN_WIFI
模板文本解析器可以帮助您生成所需的结果,示例代码:
from ttp import ttp
template = """
<input load="text">
VLAN Name Status Ports
---- -------------------------------- --------- -------------------------------
1 default active Gi1/0/3, Gi1/0/4, Gi1/0/5
10 ADMIN_SWT active
11 ADMIN_WIFI active Gi1/0/31, Gi1/0/45, Gi1/0/46
Gi1/0/47, Gi1/0/48, Gi1/0/49
12 ADMIN_SRV-DATA active
</input>
<group name="{{ vid }}">
{{ vid | DIGIT | _start_ }} {{ name }} {{ status }}
{{ vid | DIGIT | _start_ }} {{ name }} {{ status }} {{ ports | ORPHRASE | split(", ") | joinmatches | default([]) }}
{{ ports | ORPHRASE | split(", ") | joinmatches }}
</group>
"""
parser = ttp(template=template)
parser.parse()
print(parser.result(format="json")[0])
输出将是:
[
{
"1": {
"name": "default",
"ports": [
"Gi1/0/3",
"Gi1/0/4",
"Gi1/0/5"
],
"status": "active"
},
"10": {
"name": "ADMIN_SWT",
"ports": [],
"status": "active"
},
"11": {
"name": "ADMIN_WIFI",
"ports": [
"Gi1/0/31",
"Gi1/0/45",
"Gi1/0/46",
"Gi1/0/47",
"Gi1/0/48",
"Gi1/0/49"
],
"status": "active"
},
"12": {
"name": "ADMIN_SRV-DATA",
"ports": [],
"status": "active"
}
}
]
请注意组中的最后一行,它应该具有与要解析的实际文本相同的前导空格数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.