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

EXPECT脚本正则匹配异常求助:IBMIHS服务器HTTP进程数捕获错误

问题分析与解决建议

你的问题核心在于正则表达式的匹配逻辑不够精准——虽然你用了(\d+)来匹配一个或多个数字,但当前.*(\d+).*的写法会因为贪婪匹配的特性,意外捕获到输出中干扰性的单个数字(而非wc -l返回的完整结果)。从你提供的expect日志能看到,整个缓冲区里包含了命令回显、ps输出内容以及最终的11,.*会贪婪地匹配到离结尾最近的数字序列前的所有内容,导致只抓到了11里的单个1。

下面是几个针对性的解决方案:

方案1:精准匹配行尾的数字序列

把正则改成匹配输出末尾的连续数字,忽略前后的空格和换行,确保只捕获wc -l的完整结果:

expect {
    -re {\s*(\d+)\s*\r\n} { set theNum $expect_out(1,string) }
}

这个正则会匹配:任意数量空白符 + 一个或多个数字(这部分就是我们要的结果) + 任意数量空白符 + 换行符,完美避开命令回显里的干扰数字。

方案2:先跳过命令回显,再捕获结果

因为expect会收到你发送的命令回显,我们可以先匹配命令行的结束,再聚焦结果行:

send "ps -ef|grep htt|grep start|wc -l\r"
# 先匹配命令回显的结束,过滤干扰
expect "ps -ef|grep htt|grep start|wc -l\r\n"
# 再匹配结果数字
expect {
    -re {\s*(\d+)\s*} { set theNum $expect_out(1,string) }
}

这种方式能彻底排除命令回显里的多余数字,直接锁定我们需要的结果。

方案3:在shell命令层面优化输出

你也可以让wc -l直接输出纯数字,避免多余空格干扰:

ps -ef|grep htt|grep start|wc -l | tr -d ' '

这样输出的就是不带空格的11,后续正则匹配(\d+)就能直接捕获完整数字,逻辑更简单。

调整后测试脚本,应该就能正确捕获到11,从而得到正确的判断结果啦。

内容的提问来源于stack exchange,提问作者Heinz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 09:04:00