首页 > 解决方案 > 期望脚本输出

问题描述

我正在尝试使用 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”或仅提取数字的东西,但我没有任何运气。任何帮助是极大的赞赏。

标签: linuxbashshellscriptingexpect

解决方案


您将整个命令的输出存储在一个变量中,比如说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)去除/剥离左侧部分,#用于到达第一个匹配字符值(从左侧读取/解析),##用于到达最后一个匹配字符/值。它通过*<value>{ }大括号内给予来工作。

2)删除/剥离右侧部分,%用于到达第一个匹配字符值(从右侧读取/解析),%%用于到达最后一个匹配字符/值。它通过<value>*{ }大括号内给予来工作。

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

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

推荐阅读