Как использовать awk {print} внутри встроенной команды s sh - PullRequest
0 голосов
/ 17 марта 2020

Я пытаюсь запустить встроенную команду s sh, которая выглядит следующим образом:

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} - нет.

Если я запускаю эту команду непосредственно на компьютере, на котором я sh *, то получаю ожидаемый результат, но не при вызове его с помощью встроенной команды s sh, как указано выше.

Этот код в конечном итоге будет запущен в сценарии bash. Разве нельзя использовать печать таким образом? Если нет, есть ли другой метод, который вы можете предложить? Я относительно новичок в терминальной жизни, поэтому, пожалуйста, потерпите меня.

Ответы [ 2 ]

2 голосов
/ 17 марта 2020

Проблема заключается в том, как вы передаете вам 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}'"
2 голосов
/ 17 марта 2020

Радости цитирования оболочки. Строка:

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

анализируется оболочкой, которая вызывает ssh с двумя аргументами:

user@127.0.01 и df / -h | awk 'FNR == 2 {print }' $3 было интерполировано, и (I Полагаю) было пусто. Чтобы предотвратить это, у вас есть много вариантов. Один из которых:

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}'"'"'"'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...