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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 15:18:18