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
相关产品推荐
相关产品推荐

