如何用TextFSM解析含可变空格的列对齐CLI输出?
解决可变空格对齐的CLI输出解析问题
问题描述
需要解析通过可变空格实现列对齐的VLAN CLI输出,重点是准确匹配eth0-eth4列的T/U/空格状态:
VLAN Table VLAN VLAN Name Type Secure eth0 eth1 eth2 eth3 eth4 ---- --------- ---- ------ ---- ---- ---- ---- ---- 100 Port_1 Bridged Disable T U 200 Port_2 Bridged Disable T U 300 Port_3 Bridged Disable T U 400 Port_4 Bridged Disable T U 1249 AP_Mgmt Bridged Disable T
期望输出(每个eth列对应T/U/空格):
[['100', 'Port_1', 'Bridged', 'T', 'U', ' ', ' ', ' '], ['200', 'Port_2', 'Bridged', 'T', ' ', 'U', ' ', ' '], ['300', 'Port_3', 'Bridged', 'T', ' ', ' ', 'U', ' '], ['400', 'Port_4', 'Bridged', 'T', ' ', ' ', ' ', 'U'], ['1249', 'AP_Mgmt', 'Bridged', 'T', ' ', ' ', ' ', ' ']]
原尝试的问题
你之前的TextFSM模板使用固定数量的空格(\s{7,})作为eth列的分隔符,只有完全符合该空格数量的行(如400行)能匹配,其他行因列位置提前或缺失,无法满足匹配条件,导致仅返回一条记录。
修正后的TextFSM模板
利用CLI输出的固定列宽特性,先捕获每个eth列的固定宽度区域,再从中提取有效字符:
Value Required vid (\d+) Value Required vlan_name (\S+) Value Required type (\S+) # 捕获每个eth列的固定宽度区域(宽度根据表头列宽调整) Value eth0_col (.{6}) Value eth1_col (.{6}) Value eth2_col (.{6}) Value eth3_col (.{6}) Value eth4_col (.{6}) # 定义最终eth列值,默认设为空格 Value Required eth0 ([TU]|) -> default ' ' Value Required eth1 ([TU]|) -> default ' ' Value Required eth2 ([TU]|) -> default ' ' Value Required eth3 ([TU]|) -> default ' ' Value Required eth4 ([TU]|) -> default ' ' Start # 匹配行的前半部分,捕获所有eth列区域 ^\s*${vid}\s+${vlan_name}\s+${type}\s+\S+\s+${eth0_col}${eth1_col}${eth2_col}${eth3_col}${eth4_col}\s*$ # 从每个区域提取有效字符,忽略前后空格 ${eth0_col} -> ${eth0}=^\s*([TU])\s*$ ${eth1_col} -> ${eth1}=^\s*([TU])\s*$ ${eth2_col} -> ${eth2}=^\s*([TU])\s*$ ${eth3_col} -> ${eth3}=^\s*([TU])\s*$ ${eth4_col} -> ${eth4}=^\s*([TU])\s*$ -> Record
解析结果验证
运行上述模板后,将得到符合需求的输出,所有行的eth列状态都能准确匹配。
关键说明
.{6}对应每个eth列的宽度(可根据实际表头列宽微调,确保覆盖列的所有位置);-> default ' '为未匹配到有效字符的eth列设置默认空格;- 后续正则
^\s*([TU])\s*$用于从捕获区域中提取T/U,自动忽略前后冗余空格。
内容的提问来源于stack exchange,提问作者mansmokes
相关产品推荐
相关产品推荐

