【问题标题】:How to use awk {print} inside an inline ssh command如何在内联 ssh 命令中使用 awk {print}
【发布时间】:2020-06-28 19:34:48
【问题描述】:

我正在尝试运行如下所示的内联 ssh 命令:

ssh user@127.0.0.1 "df / -h | awk 'FNR == 2 {print $3}'"

我希望输出为3.8G(因为这是第二行第三列),但我得到的是/dev/sda1 6.9G 3.8G 2.8G 58% /(整个第二行)。

这意味着FNR == 2 工作正常,但{print $3} 不工作。

如果我直接在我正在 ssh 的机器上运行该命令,那么我会得到预期的结果,只是在通过上述内联 ssh 命令调用它时不会。

此代码最终将在 bash 脚本中运行。不能用这种方式打印吗?如果没有,您可以建议另一种方法吗?我对终端生活比较陌生,所以请多多包涵。

【问题讨论】:

标签: bash shell awk terminal


【解决方案1】:

问题在于您传递ssh 参数的方式。

通过调用:

ssh user@127.0.0.1 "df / -h | awk 'FNR == 2 {print $3}'"

你传递了两个参数:

  • user@127.0.0.1
  • "df / -h | awk 'FNR == 2 {print $3}'"

由于您的第二个参数在双引号内给出,$3 变量将被扩展。您可以通过转义美元符号来防止这种变量扩展:

ssh user@127.0.0.1 "df / -h | awk 'FNR == 2 {print \$3}'"

【讨论】:

  • nit: (这似乎会引起很多混乱)传递给ssh 的第二个参数 not 是否包含双引号。 ssh 从未见过他们。
  • @WilliamPursell 是的,你是对的,这就是为什么我说参数在 inside 双引号中。但是在列出参数时我不能删除它们,否则这意味着我在传递它们之前正在评估参数(à la set -x),我们甚至看不到 $3 这在答案的这一点上会很尴尬。
【解决方案2】:

shell 引用的乐趣。行:

ssh user@127.0.0.1 "df / -h | awk 'FNR == 2 {print $3}'"

由 shell 解析,使用两个参数调用 ssh

user@127.0.01df / -h | awk 'FNR == 2 {print }' $3 被插值,并且(我假设)是空的。为了防止这种情况,您有很多选择。其中之一是:

ssh user@127.0.0.1 << \EOF
df / -h | awk 'FNR == 2 {print $3}'
EOF

另一个是:

ssh user@127.0.0.1 sh -c '"df / -h | awk '"'"'FNR == 2 {print $3}'"'"'"'

【讨论】:

    猜你喜欢
    • 2013-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-30
    • 1970-01-01
    • 2012-04-02
    • 1970-01-01
    相关资源
    最近更新 更多