Como imprimir uma coluna específica com o awk em uma sessão ssh remota?

4

Ao usar df -h | grep /dev/root | awk '{print $5}' , recebo o uso do meu cartão SD no meu Pi: 78%

Mas quando eu uso /usr/bin/ssh -i /path/to/key user@server "df -h | grep /dev/root | awk '{print $5}'" de outro computador, recebo: /dev/root 7.2G 5.3G 1.6G 78% /

Completamente 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
    
por Motte001 08.07.2016 / 16:51

3 respostas

12

Você está enfrentando um problema de citação; o $5 está sendo interpretado na hora errada. Existem pelo menos duas soluções:

  1. Coloque um \ antes do $ ; por exemplo.

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

  2. Execute o df remotamente, mas o grep e o awk localmente. por exemplo,

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

FWIW, eu executei uma versão da segunda opção, mas mesclando grep e awk

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

Isso deve funcionar:

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

Observe o \ incluído antes do $ . Sem isso, o shell local expandirá a variável vazia $5 e a enviará ao servidor remoto. Essencialmente, imprimindo a linha inteira.

    
por 08.07.2016 / 16:55
1

Para fins de conclusão, outra maneira é usar o fato $n em awk não é um caso especial da sintaxe $variable como shell, mas sim o operador $ aplicado a uma expressão inteira:

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

ou combinado como

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

ou talvez melhor como uma variável

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

Mas pessoalmente eu preferiria a preferência de Stephen Harris de executar o awk localmente.

    
por 09.07.2016 / 13:59

Tags