リモート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間違った時間に解釈されています。少なくとも2つの解決策があります:

  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、2番目のオプションのバージョンを実行しますが、マージし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}'"

\以前のインクルードに注意してください$。これがない場合、ローカルシェルは空の変数を拡張してリモート$5サーバーに送信します。デフォルトでは、行全体を印刷します。

答え3

$n完全性のための別のアプローチは、inがシェルなどの構文の特別なケースではなく、整数式に適用されるawk演算子であるという事実を使用することです。$variable$

(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

関連情報