Expect脚本正则匹配IP地址失败问题求助
解决Expect脚本正则匹配IP失败的问题
核心问题分析
你的脚本之所以只捕获到命令提示符,是因为匹配顺序错误:你优先匹配了提示符,而没有先捕获ARP命令的输出内容。Expect的缓冲区是累积式的,一旦匹配到提示符,就会跳过之前未处理的ARP输出。
具体解决方法
1. 调整匹配顺序,优先捕获IP行
先匹配包含IP的ARP输出行,再处理提示符。使用expect -re结合正确的IP正则表达式,通过expect_out变量捕获目标内容:
#!/usr/bin/expect set MACADDR "00:11:22:33:44:55" # 发送ARP查询命令 send "show router arp mac $MACADDR\r" # 匹配IP地址所在行(示例匹配IP+MAC+接口的整行) expect -re {(\d+\.\d+\.\d+\.\d+)\s+\S+\s+\S+} set IP_OUTPUT $expect_out(0,string) # 清理缓冲区,匹配提示符 expect "A:device.name# " # 验证结果 puts "捕获的ARP内容: $IP_OUTPUT"
2. 更严谨的IP正则表达式
如果需要严格匹配合法IP(避免匹配错误数字串),可以使用精准正则:
expect -re {((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?))\s+\S+\s+\S+}
3. 多模式匹配(防止提前匹配提示符)
如果网络延迟导致提示符先出现,可以用多模式监听,确保优先捕获IP行:
send "show router arp mac $MACADDR\r" expect { -re {(\d+\.\d+\.\d+\.\d+)\s+\S+} { set IP_OUTPUT $expect_out(0,string) exp_continue ;# 继续匹配直到提示符 } "A:device.name# " { # 提示符出现,结束匹配 } }
关键注意事项
- 确保命令发送后,不要立即匹配提示符,先处理ARP输出
- 利用
expect_out(0,string)获取完整匹配行,expect_out(1,string)可单独提取IP部分 - 若之前有未清理的缓冲区内容,可在send命令前添加
expect -clear清空缓冲区
内容的提问来源于stack exchange,提问作者Liverwiz
相关产品推荐
相关产品推荐

