【问题标题】:How to quote a shell variable in a TCL-expect string如何在 TCL-expect 字符串中引用 shell 变量
【发布时间】:2020-02-22 15:55:11
【问题描述】:

我在期望脚本中使用以下 awk 命令来获取特定目的地的网关

route | grep $dest | awk '{print $2}'

但是,expect 脚本不喜欢上面语句中的 $2。

有谁知道 awk 的替代方法可以执行与上述相同的功能? IE。输出第二列。

【问题讨论】:

  • 你不应该在 shell 中使用像$dest 这样的变量而不转义它们。请改用grep "$dest"!仅当您希望变量中的空格被解释为真正的参数分隔符时,才不要引用它们。
  • 转义美元符号是否有效?

标签: awk expect


【解决方案1】:

你可以使用剪切:

route | grep $dest | cut -d \  -f 2

使用空格作为字段分隔符并拉出第二个字段

【讨论】:

  • 这将使用空格作为分隔符,但如果有多个空格,每个空格将有一个字段。删除重复空格之前最好使用sed。
  • 这已经奏效了。对于任何感兴趣的人,命令route | grep $dest 给出了输出10.21.1.1 10.12.1.1 255.255.255.255 UGH 2 0 0 ath1(对于任何感兴趣的人,通过无线网状网络中的 olsr 完成路由)。我已成功使用以下内容在期望脚本中从中提取第二列。 route | grep 10.21.1.1 | sed -e 's/[ ]*/ /g' | cut -d \ -f 3
  • sed 更精简的是tr:route | grep 10.21.1.1 | tr -s \ | cut -d \ -f 3。但我赞成提到awk 的答案,因为这确实是这里最好的选择。 :)
【解决方案2】:

要回答您的 Expect 问题,单引号对 Tcl 解析器没有特殊意义。您需要使用大括号来保护 awk 脚本的主体:

route | grep $dest | awk {{print $2}}

由于 awk 可以完成 grep 的工作,因此您可以少做一个进程:

route | awk -v d=$dest {$0 ~ d {print $2}}

【讨论】:

    【解决方案3】:

    在切换到另一个实用程序之前,请检查更改字段分隔符是否有效。 GNU Awk here 中的字段分隔符文档。

    【讨论】:

      【解决方案4】:

      SED 是最好的选择。如果你不介意依赖,Perl 也应该足以解决这个任务

      【讨论】:

        【解决方案5】:

        根据您的数据结构,您可以使用 cut 或 sed 来过滤和打印第二列。

        【讨论】:

          【解决方案6】:

          或者,您可以使用 Perl:

          perl -ne 'if(/foo/) { @_ = split(/:/); print $_[1]; }'
          

          这将打印包含foo 的每一行的第二个标记,: 作为标记分隔符。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2018-10-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-03-30
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多