在某些地方,awk 在 pssh 命令中不起作用

在某些地方,awk 在 pssh 命令中不起作用

我尝试使用 awk 在操作系统命令(如 uname -a 、 uptime )中仅获取列,使用 pssh 多个命令,但它没有给出正确的输出。使用“uname -a”只是我展示的一个例子,我的意思是说 awk 甚至任何命令都不起作用,我只尝试通过 awk 获得 uptime 的特定字段,但没有成功。如果有任何可能性,请告诉我。

我需要将命令放在同一行,下面是我正在尝试的命令,它给出了正确的输出。但 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

答案1

如果你打开 bash shell 调试,你就可以看到哪里出了问题

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

因此调用 shell 将命令分成两个参数:

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参数周围的单引号可防止调用 shell 在本地扩展和运行命令替换

  • 表达式周围的双引号awk不会阻止$3远程 shell 扩展,因此请使用反斜杠对其进行转义

或者,您可以awk通过打开和关闭单引号在表达式周围添加文字单引号:

'echo $(date) $(uname -a|awk '\''{print $3}'\'')'

相关内容