Awk 如何在TCL expect字符串中引用shell变量

Awk 如何在TCL expect字符串中引用shell变量,awk,expect,Awk,Expect,我在expect脚本中使用以下awk命令来获取特定目的地的网关 route | grep $dest | awk '{print $2}' 但是,expect脚本不喜欢上面语句中的$2 是否有人知道替代awk执行上述相同功能的替代方案?例如,输出第二列。根据数据的结构,您可以使用cut或sed对第二列进行过滤和打印。您可以使用cut: route | grep $dest | cut -d \ -f 2 如果使用空格作为字段分隔符并在切换到另一个实用程序之前拉出第二个字段,请检查更改字段分

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

route | grep $dest | awk '{print $2}'
但是,expect脚本不喜欢上面语句中的$2


是否有人知道替代awk执行上述相同功能的替代方案?例如,输出第二列。

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

您可以使用cut:

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

如果使用空格作为字段分隔符并在切换到另一个实用程序之前拉出第二个字段,请检查更改字段分隔符是否有效。GNU Awk中的字段分隔符文档。

SED是最佳的替代使用方法。如果您不介意依赖关系,那么Perl也应该足以解决该任务。或者,您可以使用Perl:

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

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

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

route | grep $dest | awk {{print $2}}
由于awk可以做grep所做的事情,您只需少做一个过程:

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

这将使用空格作为分隔符,但如果有多个空格,则每个空格将有一个字段。最好在删除重复的空格之前使用sed。这已经奏效了。仅针对感兴趣的任何人,命令
route | grep$dest
给出了输出
10.21.1.1 10.12.1.1 255.255.255 UGH 2 0 0 ath1
(感兴趣的任何人通过无线网状网络中的olsr进行路由)。我已经在expect脚本中成功地使用以下内容从中提取了第2列<代码>路由| grep 10.21.1.1 | sed-e的/[]*//g'| cut-d-f3比
sed
要精简得多
tr
路由| grep 10.21.1.1 | tr-s\| cut d-f3
。但我对提到awk的答案投了更高的票,因为这确实是最好的选择决不能在shell中使用像
$dest
这样的变量而不转义它们。改用
grep“$dest”
!只有当您希望将变量中的空格解释为实数参数分隔符时,才将其保留为不带引号。如果您转义美元符号,是否有效?