如何将Plink获取的交换机MAC地址表转为数组或纯文本?
处理Plink输出中的MAC地址表(清理控制字符并转为数组)
第一步:清理终端控制字符和冗余内容
那些[1;24r类的字符是ANSI终端控制序列,直接用正则替换清除。同时过滤掉重复的交换机提示符和输入的命令行:
# 清除所有ANSI终端控制字符 $cleanOutput = $output -replace '\x1b\[[0-?]*[ -/]*[@-~]', '' # 过滤冗余行:提示符、命令行、空行 $cleanLines = $cleanOutput -split "`n" | Where-Object { $_ -notmatch '^192-168-1-110--2930-48POE#\s*$' -and $_ -notmatch 'show mac-address' -and $_ -notmatch '^\s*$' }
第二步:提取MAC地址表核心内容
定位表头位置,跳过表头和分隔线,只提取数据行:
# 找到表头行的索引 $headerLine = $cleanLines | Where-Object { $_ -match 'MAC Address\s+Port\s+VLAN' } $headerIndex = $cleanLines.IndexOf($headerLine) # 跳过表头+分隔线,提取数据行 $tableDataLines = $cleanLines | Select-Object -Skip ($headerIndex + 2)
第三步:转为PowerShell对象数组
用正则解析每行数据,生成结构化的对象数组,方便后续操作:
$macAddressTable = $tableDataLines | ForEach-Object { # 匹配MAC地址、端口、VLAN字段(适配你的输出格式) if ($_ -match '^\s*([0-9a-fA-F-]+)\s+(\S.+?)\s+(\d+)\s*$') { [PSCustomObject]@{ MACAddress = $matches[1] Port = $matches[2].Trim() VLAN = [int]$matches[3] } } } # 查看结果 $macAddressTable
说明
如果你的交换机输出格式有细微差异,只需调整正则表达式的匹配规则即可,核心流程不变:清理控制字符 → 定位表范围 → 解析结构化数据。
内容的提问来源于stack exchange,提问作者Elias
相关产品推荐
相关产品推荐

