В некоторых местах awk не работает в команде pssh

Я пытаюсь выбрать только столбец с помощью awk в командах ОС как uname-a, время работы, с помощью pssh несколько команд, Но он не дает корректный вывод. Используя "uname-a" просто пример, который я показал, я означал говорить, что awk не работает даже ни одна команда, я попробовал только конкретное поле времени работы через awk, но никакую удачу. Сообщите мне, если существует возможность..

Моя потребность состоит в том, чтобы поместить команды в ту же строку, и Ниже команда, я пробую, который дает корректный вывод. Но Не с awk

pssh -h /tmp/hosts -i 'echo "$(echo -n);$(date);$(uname -a)"'
[1] 13:41:35 [SUCCESS] server1
;Sun Jan 27 12:41:35 UTC 2019;Linux server1 3.12.74-60.64.99-default #1 SMP Tue Aug 14 07:11:35 UTC 2018 (d28148a) x86_64 x86_64 x86_64 GNU/Linux
[2] 13:41:35 [SUCCESS] server2
;Sun Jan 27 12:41:35 UTC 2019;Linux server2 3.12.74-60.64.99-default #1 SMP Tue Aug 14 07:11:35 UTC 2018 (d28148a) x86_64 x86_64 x86_64 GNU/Linux

Ниже использование команд с командой awk, Не работает

pssh -h /tmp/hosts -i 'echo "$(echo -n);$(date);$(uname -a|awk '{print \$3}')"'

[1] 13:54:54 [SUCCESS] server1
;Sun Jan 27 12:54:54 UTC 2019;
Stderr: awk: cmd. line:1: {print
awk: cmd. line:1:       ^ unexpected newline or end of string
[2] 13:54:54 [SUCCESS] server2
;Sun Jan 27 12:54:54 UTC 2019;
Stderr: awk: cmd. line:1: {print
awk: cmd. line:1:       ^ unexpected newline or end of string
0
задан 27 January 2019 в 06:32

1 ответ

Вы видите то, что идет не так, как надо, если Вы включаете отладку оболочки удара

$ set -x
$ parallel-ssh -h hostsfile -i 'echo "$(uname -a | awk '{print $3}')"'
+ parallel-ssh -h hostsfile -i 'echo "$(uname -a | awk {print' '})"'

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

echo "$(uname -a | awk {print

и

$3})"

$3 будучи расширенным до пустого значения). Это - один из (редких) случаев, где обычное, "если в сомнении, добавляют, что кавычки" не помогают Вам - двойные кавычки вокруг замены команды в echo не действительно необходимы, и если Вы удаляете их, можно избавиться от одного уровня вложения кавычки. Затем можно просто сделать

$ parallel-ssh -h hostsfile -i 'echo $(date) $(uname -a|awk "{print \$3}")'
[1] 09:13:36 [SUCCESS] vm
Sun Jan 27 09:13:36 EST 2019 4.4.0-141-generic
[2] 09:13:37 [SUCCESS] localhost
Sun Jan 27 09:13:37 EST 2019 4.15.0-43-generic

где

  • одинарные кавычки вокруг целого pssh аргумент препятствует тому, чтобы оболочка вызова развернула и выполнила замены команды локально

  • двойные кавычки вокруг awk выражение не предотвращает $3 frombeing, расширенный удаленной оболочкой, таким образом, обратная косая черта выходят из него

С другой стороны, можно добавить литеральные одинарные кавычки вокруг awk выражение путем открытия и закрытия одинарных кавычек:

'echo $(date) $(uname -a|awk '\''{print $3}'\'')'
1
ответ дан 26 October 2019 в 11:06

Другие вопросы по тегам:

Похожие вопросы: