如何使用EXPECT脚本将交换机线缆状态输出保存为CSV文件?
解决Expect脚本捕获交换机线缆状态并导出为CSV的方案
我来帮你搞定这个需求!要把Expect脚本获取的交换机线缆状态转成CSV,核心是两步:捕获命令输出并解析关键数据,然后将解析后的数据写入CSV文件。下面是具体的实现思路和示例代码:
1. 调整Expect脚本,捕获并解析线缆状态输出
首先,你需要在现有脚本的基础上,添加逻辑来捕获显示线缆状态命令的输出,然后用正则表达式提取出Pair(比如PA对应Pair A)和对应的Length(LA对应长度值)。
假设你的原脚本大概是登录交换机+执行命令的结构,现在修改它加入数据解析和CSV导出逻辑:
#!/usr/bin/expect # 配置参数 set switch_ip "192.168.1.1" set username "admin" set password "your_password" set cable_cmd "show cable status" ;# 替换成你实际用的线缆状态命令 set csv_file "cable_stats.csv" ;# 最终输出的CSV文件名 # 初始化CSV文件,先写入表头 set fp [open $csv_file w] puts $fp "\"Pair\",\"Length\"" close $fp # 登录交换机流程 spawn telnet $switch_ip expect "Username:" send "$username\r" expect "Password:" send "$password\r" expect "Switch>" ;# 替换成你的交换机实际提示符 # 执行线缆状态命令并捕获解析输出 send "$cable_cmd\r" # 用正则匹配每一行有效数据,循环提取直到回到提示符 expect { -re {P([A-Z]): Pair (\w+), L\1: (\d+m)} { # 提取正则分组:\1是线对标识(A/B/C),\2是Pair名称,\3是长度值 set pair_name $expect_out(2,string) set pair_length $expect_out(3,string) # 把数据追加写入CSV set fp [open $csv_file a] puts $fp "\"$pair_name\",\"$pair_length\"" close $fp # 继续匹配下一行数据 exp_continue } "Switch>" { ;# 匹配到提示符,说明命令执行完毕 puts "线缆状态数据已成功导出到 $csv_file" } } # 退出登录 send "exit\r" expect eof
2. 关键逻辑说明
- CSV初始化:先创建CSV文件并写入表头
"Pair","Length",保证输出格式符合CSV规范。 - 正则匹配:我假设你的交换机输出行格式是
PA: Pair A, LA: 100m,正则P([A-Z]): Pair (\w+), L\1: (\d+m)会精准匹配:P([A-Z]):捕获线对的标识(A/B/C等)Pair (\w+):捕获线对的名称(比如A)L\1:确保Length的标识和Pair的标识对应(比如PA对应LA,避免匹配错乱)(\d+m):捕获具体的长度值(比如100m)
- 追加写入CSV:每匹配到一行有效数据,就打开CSV文件追加写入一行,格式为
"Pair A","100m",保证数据格式正确。
3. 适配你的实际输出格式
如果你的交换机输出格式和我假设的不一样,只需要调整正则表达式即可。比如如果输出是:
Pair A (PA): Length 50m
那正则可以改成-re {Pair (\w+) \(P([A-Z])\): Length (\d+m)},然后调整分组的提取顺序就行。
4. 测试脚本
- 把脚本保存为
cable_stats.exp - 赋予执行权限:
chmod +x cable_stats.exp - 运行脚本:
./cable_stats.exp - 查看生成的
cable_stats.csv,就能看到格式化后的线缆状态数据了。
内容的提问来源于stack exchange,提问作者aCUDDLYduck
相关产品推荐
相关产品推荐

