繁体   English   中英

从多个shell命令的输出创建单行

[英]Creating a single line from output of multiple shell commands

我尝试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)

我怎么能这样做?

它不是很整洁,但使用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"

使用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 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM