我正在远程机器上导航基于Java的CLI菜单,期望在bash脚本中,我试图从输出中提取一些内容而不离开期望会话.
我的脚本中的Expect命令是:
expect -c "
spawn ssh user@host
expect \"#\"
send \"java cli menu command here\r\"
expect \"java cli prompt\"
send \"java menu command\"
"
###I want to extract a specific string from the above output###
Run Code Online (Sandbox Code Playgroud)
期望输出是:
Id Name
-------------------
abcd 12 John Smith
Run Code Online (Sandbox Code Playgroud)
我想abcd 12从上面的输出中提取另一个期望变量,以便在expect脚本中进一步使用.所以这是第3行,第一个字段是使用双空格分隔符.awk等价物将是:awk -F ' ' 'NR==3 {$1}'
最大的问题是,我正在使用Expect导航的环境是,如上所述,基于Java CLI的菜单,所以我不能只使用awk或其他任何可从bash shell获得的东西.
从Java菜单中退出,处理输出然后再次进入不是一个选项,因为登录过程持续15秒,所以我需要留在内部并使用expect内部命令从输出中提取我需要的内容.
考虑以下示例,模拟一个在 10 秒后给出输出的命令:exec 5< <(sleep 10; pwd)
在 Solaris 中,如果我在 10 秒之前检查文件描述符,我可以看到它的大小为 0,这告诉我它尚未填充数据。我可以简单地每秒检查一次,直到满足文件测试条件(不同于 0),然后提取数据:
while true; do
if [[ -s /proc/$$/fd/5 ]]; then
variable=$(cat <&5)
break
fi
sleep 1
done
Run Code Online (Sandbox Code Playgroud)
但在 Linux 中我不能这样做(RedHat、Debian 等)。所有文件描述符都以 64 字节大小显示,无论它们是否保存数据。对于需要不同时间来转储输出的各种命令,我不知道何时应该读取文件描述符。不,我不想只是等待cat <&5完成,我需要知道什么时候应该cat首先执行。因为我使用这种机制来发出同时命令并将其输出分配给相应的文件描述符。正如已经提到的,这在 Solaris 中效果很好。