【问题标题】:Expect Script - awk say variable doesn't exist期望脚本 - awk 说变量不存在
【发布时间】:2020-01-23 01:09:40
【问题描述】:
#!/usr/bin/expect -f

set name [lindex $argv 0]

send  "grep $name /usr/local/bin/c | awk '{print $3}' | awk '{print substr($1,10)}'\r"
spawn  grep $name /usr/local/bin/c | awk '{print $3}' | awk '{print substr($1,10)}'

我尝试过“\”转义引号和特殊符号。它不起作用。我也尝试过发送和生成。不工作。如果我只运行 grep........... 命令,它会返回我需要的内容。关于如何从我的期望文件中运行它的任何帮助都会很棒。谢谢。

【问题讨论】:

  • 首先简化您的命令 - 您不需要 grep、2 awks 和管道来执行此任务。如果您要在命令行上运行它,它将是awk -v n="$name" '$0 ~ n{print substr($3,10)}' /usr/local/bin/c,所以这就是您应该尝试使用expect 开始工作的命令。我会先尝试让像awk 'BEGIN{print "hello world"}' 这样更简单的命令来工作。
  • 谢谢。我仍然收到错误:无法读取“0”:执行“spawn awk -v n="perferx" '$0 ~ n{print substr($3,10,5)}' /usr/local/bin/ 时没有这样的变量C”。关于尝试什么的任何想法。谢谢。
  • 我并不是要建议您可以简单地将 awk 脚本插入到期望脚本中并且它会起作用,我只是说这是开始的命令行脚本。我已经给出了尝试的想法 - 从尝试让awk 'BEGIN{print "hello world"}' 等更简单的命令开始工作

标签: awk grep expect


【解决方案1】:

单引号在expect中没有特殊含义。使用大括号代替同样的效果:

spawn awk -v n="perferx" {$0 ~ n {print substr($3,10,5)}} /usr/local/bin/c
# .......................^..............................^

参考:Tcl syntax rules, #6

大括号之间的字符不进行替换


另外,在没有看到你对输出做了什么的情况下,也许你不需要spawn

set output [exec awk -v n="perferx" {$0 ~ n {print substr($3,10,5)}} /usr/local/bin/c]

现在,您可以对 $output 进行简单的字符串解析

【讨论】:

  • 这是我需要的,但它变成了一个变量。使完成我正在做的事情变得容易得多。我确实在另一篇文章中看到了这一点,但对我来说不是很清楚。
  • expect 是一个非常有用的工具,但它确实有一个非常狭窄的应用程序。一旦你意识到 expect 是建立在 Tcl 之上的,并且你有一个强大的通用语言来工作,事情就会变得简单。
猜你喜欢
  • 2019-05-14
  • 1970-01-01
  • 2017-07-07
  • 1970-01-01
  • 1970-01-01
  • 2016-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多