如何在远程 ssh 会话上使用 awk 打印特定列?

如何在远程 ssh 会话上使用 awk 打印特定列?

使用时

df -h | grep /dev/root | awk '{print $5}'

我得到了 Pi 中 SD 卡的使用情况:78%

但是当我使用

/usr/bin/ssh -i /path/to/key user@server "df -h | grep /dev/root | awk '{print $5}'"

从另一台计算机上,我得到:

/dev/root       7.2G  5.3G  1.6G  78% /

满的df -h

Filesystem      Size  Used Avail Use% Mounted on
/dev/root       7.2G  5.3G  1.6G  78% /
devtmpfs        364M     0  364M   0% /dev
tmpfs           368M   68K  368M   1% /dev/shm
tmpfs           368M  5.2M  363M   2% /run
tmpfs           5.0M  4.0K  5.0M   1% /run/lock
tmpfs           368M     0  368M   0% /sys/fs/cgroup
/dev/mmcblk0p1   60M   21M   40M  35% /boot
tmpfs            74M  4.0K   74M   1% /run/user/1000

答案1

你遇到了引用问题;$5在错误的时间被解释。至少有两种解决方案:

  1. \在 ;之前放一个$;例如

    /usr/bin/ssh -i /path/to/key user@server "df -h | grep /dev/root | awk '{print \$5}'"
    
  2. 远程运行df但在grep本地运行awk。例如

    /usr/bin/ssh -i /path/to/key user@server df -h | grep /dev/root | awk '{print $5}'
    

FWIW,我会运行第二个选项的版本,但合并grepawk

/usr/bin/ssh -i /path/to/key user@server df -h | awk '/\/dev\/root/ {print $5}'

答案2

这应该有效:

/usr/bin/ssh -i /path/to/key user@server "df -h | grep /dev/root | awk '{print \$5}'"

请注意\之前包含的$.如果没有这个,本地 shell 将扩展空变量$5并将其发送到远程服务器。本质上,打印整行。

答案3

为了完整起见,另一种方法是使用事实$ninawk不是$variable像 shell 这样的语法的特殊情况,而是$应用于整数表达式的运算符:

(ssh key&remote) "df -h | grep /dev/root | awk '{print $ 5}'"

或组合为

(ssh key&remote) "df -h | awk '/\\/dev\\/root/ {print $ 5}'"
# can use [/] instead of ugly \\/ in gawk, but maybe not others

或者作为变量可能更好

(ssh key&remote) "df -h | awk -vm=/dev/root '$ 0 ~ m {print $ 5}'"

但就我个人而言,我会同意斯蒂芬·哈里斯(Stephen Harris)在awk本地运营的偏好。

相关内容