我尝试使用 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}'\'')'