使用 awk 时转义 exp_send 中的 ^ 符号

Escaping ^ symbol in exp_send when using awk

所以我需要从 expect 脚本传递 Awk 命令来识别包含特定八位字节的 eth 接口,我目前正在做,

exp_send "ip addr show | awk -F: '/\^\[0-9\]/ {dev=$2} /inet .*\.227/ {print dev; exit}' \r"

问题出在 /\^\[0-9\] 部分,单个 \ 不起作用,我也尝试添加 \,但似乎也不起作用。

还尝试将整个 awk 内容包装在 {..} 中,但这也没有用。

exp_send "ip addr show | awk -F: {/^\[0-9\]/ {dev=$2} /inet .*\.227/ {print dev; exit}} \r"

任何有关如何解决此问题的线索都将不胜感激。


更新,根据@whjm 的建议,我启用了内部调试器选项

exp_internal -f /tmp/debug 1
exp_send "ip addr show | awk -F: '/^\[0-9]/ {dev=$2} /inet .*\.227/ {print dev; exit}'\r"
exp_internal 0

生成信息为

send: sending "ip addr show | awk -F: '/^[0-9]/ {dev=} /inet .*\.227/ {print dev; exit}'\r" to { exp13 }

终端设备上的控制台捕获生成,

$ send: sending "ip addr show | awk -F: '/[0-9]/ {dev=} /inet .*\.227/ {print dev; exit}'\r" to { exp13 }
ip addr show | awk -F: '/[0-9]/ {dev=} /inet .*\.227/ {print dev; exit}'

^ 字符在发送时以某种方式丢失。

看来是外面的引号你要注意了。尝试

exp_send {ip addr show | awk -F: '/^[0-9]/ {dev=} /inet .*\.227/ {print dev; exit}'}
# .......^ using Tcl non-substituting quotes, so inside stuff does not need escaping
exp_send "\r"

如果您想使用双引号(例如在其中包含一些 $var):

exp_send "ip addr show | awk -F: '/^\[0-9]/ {dev=$2} /inet .*\.227/ {print dev; exit}'\r"

在 Tcl 语言中:

  1. ^'并不特殊。
  2. {在双引号中没有特殊意义("...").