You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.11 19:14:49