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

时间:2017-07-26 00:32:24

标签: linux shell ssh

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

我怎么能这样做?

3 个答案:

答案 0 :(得分:0)

它不是很整洁,但使用printf有效。 hostnameuname -r已经过验证可以使用。我不知道ipmitool输出是什么,所以我无法验证。

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

使用bash Array variables。将每个 while( fgets(buf,sizeof(buf),stdin) ){ printf("%s", buf); if(strcmp(buf,"\n") == 0){ break; } while(write(right_con, buf,sizeof(buf)) < 0) { printf("Error writing to socket\n"); exit(1); } memset(buf,0,sizeof(buf)); } rc = read(keyboard,buf,sizeof(buf)); 命令的输出附加到数组。最后,ssh数组的所有元素。结果将是所有数组元素在一行上。将IFS(内部字段分隔符)设置为所需的每个主机分隔符。 (我使用echo。)为了处理同一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[*]}";