【问题标题】:Expect script output期望脚本输出
【发布时间】:2018-07-26 20:25:01
【问题描述】:

我正在尝试使用 Expect 脚本从 FW 输出 ARP 表的大小,以便绘制图表。在下面的代码之后,显示到屏幕的输出如下所示:

/usr/bin/expect -f -<< EOD
spawn ssh test@1.2.3.4
sleep 1
expect {
"*word:" {send "password\r"}
}
sleep 1
expect {
"*>" {send "show arp all | match \"total ARP entries in table\"\r"}
}
sleep 1
expect {
"*>" {send "exit\r"} 
}
expect eof
EOD

spawn ssh test@1.2.3.4
FW-Active
Password:
Number of failed attempts since last successful login: 0
test@FW-Active(active)> show arp all | match "total ARP entries in table"
total ARP entries in table :        2861

我想要做的是能够只输出表中总 ARP 条目中指示的数值。我假设我需要一些如何做“cut”或“awk”或仅提取数字的东西,但我没有任何运气。非常感谢任何帮助。

【问题讨论】:

  • 为什么投反对票?

标签: linux bash shell scripting expect


【解决方案1】:

您将整个命令的输出存储在一个变量中,比如说a。 这样的事情可能会奏效。由于您使用的是期望,您可能想弄清楚如何将该输出存储为变量,以便您可以操作它。在我的示例中,我将输出存储为 $a。

$ echo $a
total ARP entries in table : 2861
$ echo ${a% *}
total ARP entries in table :
$ echo ${a% *}-
total ARP entries in table : -
$ echo ${a##* }
2861

逻辑解释(BASH中的参数/变量替换)
1) 要移除/剥离左侧部分,使用# 获得第一个匹配字符值(从左侧读取/解析),## 获得最后一个匹配字符/值。它通过在 { } 大括号内给出 *&lt;value&gt; 来工作。

2) 要删除/剥离右侧部分,请使用% 获取第一个匹配字符值(从右侧读取/解析),%% 获取最后一个匹配字符/值。它通过在 { } 大括号内给出 &lt;value&gt;* 来工作。

或者,如果您不想存储输出或任何内容,那么只需执行以下操作:

show arp all | match "total ARP entries in table" | grep -o "[0-9][0-9]*"

或者(以下假设你不改变

show arp all | match "total ARP entries in table" | sed "s/  *//g"|cut -d':' -f2

【讨论】:

  • 感谢您的回复,我将研究如何在期望中使用变量。不幸的是,防火墙不允许进一步使用 RegEX,例如您建议使用 grep 和 sed。我可能会尝试将输出记录到文件中,然后从那里提取数字。谢谢。