从多个shell命令的输出中创build一行

我尝试SSH到多个主机(成千上万),捕获一些命令输出并写入一个文件。 但是所有命令的输出应该在同一行,逗号分隔,空格分隔,而且每个主机都在同一行中。

所以我的命令就像“:

ssh $host "hostname; uname -r; echo mypassword| sudo -S ipmitool mc info | grep 'Firmware Revision' " > ssh.out 

但是,如果我这样使用,它会将所有命令输出写入单独的行。 (每台主机3行)。 但是我想要的只是每个主机只有一行,假设:

 myserver,3.2.45-0.6.wd.514,4.3 (comma or any field separator is fine) 

我怎么能做到这一点?

使用bash 数组变量 。 将每个ssh命令的输出追加到数组中。 最后, echo显数组中的所有元素。 结果将是一行中的所有数组元素。 将IFS (内部字段分隔符)设置为所需的每个主机分隔符。 (我使用过。)为了在同一个ssh会话中处理来自多个命令的多行输出,使用tr用分隔符替换换行符。 (我用了一个空格。)

 sshoutput=() for host in host01 host02 host03; do sshoutput+=($(ssh $host 'echo $(hostname; uname -a; echo mypassword) | tr "\n" " "')) done IFS=,; echo "${sshoutput[*]}"; 

产量

 host01.domain.com Linux host01.domain.com 2.6.32-696.3.1.el6.x86_64 #1 SMP Thu Apr 20 11:30:02 EDT 2017 x86_64 x86_64 x86_64 GNU/Linux mypassword ,host02.domain.com Linux host02.domain.com 2.6.32-696.3.1.el6.x86_64 #1 SMP Thu Apr 20 11:30:02 EDT 2017 x86_64 x86_64 x86_64 GNU/Linux mypassword ,host03.domain.com Linux host03.domain.com 2.6.32-696.3.1.el6.x86_64 #1 SMP Thu Apr 20 11:30:02 EDT 2017 x86_64 x86_64 x86_64 GNU/Linux mypassword 

这不是很整洁,但使用printf作品。 hostnameuname -r被验证可以正常工作。 我不知道什么ipmitool输出,所以我无法验证它。

 ssh $host "printf $(hostname),$(uname -r),$(echo mypassword| sudo -S ipmitool mc info | grep 'Firmware Revision')\n" > ssh.out 

您可以将ssh的输出保存到一个变量中,然后打印出来:

 ssh_output=$(ssh $host "hostname; uname -r; echo mypassword | sudo -S ipmitool mc info | grep 'Firmware Revision' ") printf '%s\n' "$ssh_output" 

  • 请参阅此文档,其中解释了shell如何处理上面的命令输出: Bash命令替换
  • 分享到 :相关文章: 如何设置一个变量来自Bash命令的输出?