Linux Bash脚本:将多行输出到一行

Linux Bash脚本:将多行输出到一行,linux,bash,shell,Linux,Bash,Shell,我们目前有一个服务器监视器脚本,用于监视63台服务器,我们希望在此脚本中再添加40台服务器。问题在于,我们希望将脚本的全部内容保留在单个监视器上(旋转90度) 我想知道是否有可能在一条线上输出两台服务器,以及它是如何实现的。比如说 我们目前有 web1 | 2.11 | 2.05 | 1.95 | (116) HTTP Processes web2 | 0.06 | 0.12 | 0.15 | (113)

我们目前有一个服务器监视器脚本,用于监视63台服务器,我们希望在此脚本中再添加40台服务器。问题在于,我们希望将脚本的全部内容保留在单个监视器上(旋转90度)

我想知道是否有可能在一条线上输出两台服务器,以及它是如何实现的。比如说

我们目前有

web1                        | 2.11 | 2.05 | 1.95 | (116) HTTP Processes
web2                        | 0.06 | 0.12 | 0.15 | (113) HTTP Processes

data1                       | 1.04 | 0.93 | 0.90 |
data2                       | 0.36 | 0.52 | 0.43 |
data3                       | 0.41 | 0.31 | 0.28 |
data4                       | 1.48 | 1.41 | 1.28 |
data5                       | 1.10 | 1.07 | 1.10 |
data6                       | 5.60 | 4.78 | 4.08 |
data7                       | 0.30 | 0.31 | 0.29 |
data8                       | 1.44 | 2.18 | 2.00 |
data9                       | 0.11 | 0.22 | 0.26 |
data10                      | 0.19 | 0.25 | 0.31 |

sql1                        | 0.42 | 0.58 | 0.61 |
sql2                        | 0.26 | 0.24 | 0.27 |
sql3                        | 0.06 | 0.08 | 0.09 |
我们想做的是:

web1           | 2.11 | 2.05 | 1.95 | (116) HTTP Processes
web2           | 0.06 | 0.12 | 0.15 | (113) HTTP Processes

data1          | 1.04 | 0.93 | 0.90 | - data6          | 5.60 | 4.78 | 4.08 |
data2          | 0.36 | 0.52 | 0.43 | - data7          | 0.30 | 0.31 | 0.29 |
data3          | 0.41 | 0.31 | 0.28 | - data8          | 1.44 | 2.18 | 2.00 |
data4          | 1.48 | 1.41 | 1.28 | - data9          | 0.11 | 0.22 | 0.26 |
data5          | 1.10 | 1.07 | 1.10 | - data10         | 0.19 | 0.25 | 0.31 |

sql1           | 0.42 | 0.58 | 0.61 |
sql2           | 0.26 | 0.24 | 0.27 |
sql3           | 0.06 | 0.08 | 0.09 |
等等

如您所见,我们希望将某些服务器类型分组在一起(web、cassandra、sql、grid)

脚本监视平均负载,因此也需要将其适应(监视器上有足够的空间显示此内容)

可能还是我在问不可能

当前脚本:

cleanquit () {
echo "$(tput sgr0)"
clear
exit $?
 }

 trap cleanquit SIGINT

 clear

 while [ 1 ]
 do
 tput cup 0 0

 echo "$(tput sgr0)"

 for i in web1 web2 data1 data2 data3 data4
if [ $i == "space" ]; then
    echo "$(tput setaf 7)"
    UPS=""
else

if [ $i == "self" ]; then
        UPTIME=$(cat /proc/loadavg);
    else
        UPTIME=$(ssh root@$i cat /proc/loadavg);
    fi

    if [ -z "$UPTIME" ]; then
        tput cuu1
        tput el
        printf " $(tput setaf 1)%-25s\t | CONNECTION FAILED  |\n" $i;
    else
        thisloadavg1=$(echo $UPTIME|awk '{ print $1}' | bc -q 2>/dev/null)
        thisloadavg2=$(echo $UPTIME|awk '{ print $2}' | bc -q 2>/dev/null)
        thisloadavg3=$(echo $UPTIME|awk '{ print $3}' | bc -q 2>/dev/null)
        additional=""

        if [ ${i:0:3} == "web" -o ${i:0:4} == "grid" ]; then
            additional=$(ssh root@$i ps aux | grep "sbin/http" | wc -l)
            if [ $additional -gt 0 ]; then
                additional="("$additional") HTTP Processes"
            else
                additional=""
            fi
        fi

        if [ $i == "self" ]; then

            additional=$(ps aux | grep "sbin/http" | wc -l)
            if [ $additional -gt 0 ]; then
                additional="("$additional") HTTP Processes"
            else
                additional=""
            fi

        fi

        if [ $(echo "$thisloadavg1 > 5.0" | bc) -eq 1 ]; then
            printf " $(tput setaf 1)%-25s\t $(tput setaf 7)|$(tput setaf 1) %0.2f $(tput setaf 7)|$(tput setaf 1) %0.2f $(tput setaf 7)|$(tput setaf 1) %0.2f $(tput setaf 7)| %s %s %s\n" $i $thisloadavg1 $thisloadavg2 $thisloadavg3 $additional;
        else
            if [ $(echo "$thisloadavg1 > 3.0" | bc) -eq 1 ]; then
                printf " $(tput setaf 3)%-25s\t $(tput setaf 7)|$(tput setaf 3) %0.2f $(tput setaf 7)|$(tput setaf 3) %0.2f $(tput setaf 7)|$(tput setaf 3) %0.2f $(tput setaf 7)| %s %s %s \n" $i $thisloadavg1 $thisloadavg2 $thisloadavg3 $additional;
            else
                if [ $(echo "$thisloadavg1 > 1.5" | bc) -eq 1 ]; then
                    printf " $(tput setaf 6)%-25s\t $(tput setaf 7)|$(tput setaf 6) %0.2f $(tput setaf 7)|$(tput setaf 6) %0.2f $(tput setaf 7)|$(tput setaf 6) %0.2f $(tput setaf 7)| %s %s %s \n" $i $thisloadavg1 $thisloadavg2 $thisloadavg3 $additional;
                else
                    printf " $(tput setaf 7)%-25s\t | %0.2f | %0.2f | %0.2f | %s %s %s\n" $i $thisloadavg1 $thisloadavg2 $thisloadavg3 $additional;
                fi
            fi
        fi
    fi

fi
tput el
done

echo

tput sgr0
tput ed
sleep 2;
done`

pr
过滤器可以将数据放入列中。它被设计用来布局带有页眉和页脚的行打印机页面,但至少GNU pr允许您关闭这些功能。尝试
pr-bt3您可以使用
标准过滤器对任意输入进行列化。

请发布一些实际代码,说明您如何打印输出。如果您监控了如此多的服务器,为什么不使用更复杂的监控工具,如Nagios。“它具有开箱即用的分组和平均负载监控功能。@添加了EduardoIvanec当前代码。@Hovanesyan我们已经看过nagios,虽然它可以做很多事情,但它可以在一个地方实时监控系统的负载。”。Nagios的设置也需要很多时间,这个脚本只是我们整个监控系统的一小部分。:)当然Nagios需要一些时间来适应配置。虽然linux中的基本设置可能是1行,包下载时间为10分钟:)。此外,它还可以提供近乎实时的平均负载监控(或事实上监控其他参数),但在大多数情况下,这会导致网络中出现不必要的高带宽—大多数人都会避免这种情况。@J.F.Sebastian:它在我的终端中工作得非常好。当我在最后一个输入条目后添加换行符时,它在您的Ideone代码段中也正常工作。请尝试
column-c20
以获得更好的输出。@EduardoIvanec不错,但问题是我们不希望所有服务器都这样显示,只希望显示某些服务器,这与我们现有的代码如何匹配?