期望将脚本grep和awk输出用作变量

时间:2018-12-13 01:31:12

标签: unix awk grep expect

我已经看过了,却没有看到像这样的问题。 我有一个期望脚本,可以登录到远程系统并可以发送命令。 我有一个特殊情况,我需要根据前一个命令的输出发送命令。

我将登录到的每个主机的会话记录到一个文件中,因此我的游戏计划是可能将该日志文件grep为所需的值,然后将其传递给接下来的几个命令。

例如。 SSH到设备。 发送将在$ this_host.log中包含字符串的命令: 返回实例:541(故意省略部分输出) 在shell中,您可以通过执行以下操作获得541部分: grep“返回实例” * .log | awk'{print $ 7}'

期望我希望将541值存储到变量中,以便随后执行以下操作: 发送“ next.command。$ value”,其中value等于541。541只是一个示例,因为它可以是任何3位数字。

我不确定如何转换该grep | awk组合期望格式。 我一直在常规的shell脚本中使用这些组合:例如 UPTIME =“ $(grep -E”系统正常运行时间:“ $ log | awk'{print $ 3 $ 4 $ 5 $ 6 $ 7 $ 8}')”

1 个答案:

答案 0 :(得分:0)

不要那样做。您已经在期望中:期望自动执行交互式会话:您可以捕获所发送命令的输出。

一个示例:您已连接到远程系统,并且要发送date命令。您的提示是主机名,后跟$,后跟空格。在视觉上,您会看到:

host$ date
Wed Dec 12 20:48:57 EST 2018
host$

期望您会这样做:

expect -re {\$ $}
send "date\r"
expect -re {(.+)\$ $}

此时,$expect_out(1,string)包含以下文本:date\r\nWed Dec 12 20:48:57 EST 2018\r\nhost。您既要获取命令又要获得提示,这有点麻烦,但是通过Tcl字符串处理,我们可以轻松地处理它:

set lines [split $expect_out(1,string) \n]
set no_cr [lmap line $lines {string {map "\r" ""} $line}]
set command_out [join [lrange $no_cr 1 end-1] \n]