首页 > 解决方案 > 在 bash 中显示数据网格

问题描述

想就如何在 bash 中最好地做到这一点提出意见,谢谢

对于 x 台服务器,每个服务器都有自己的复制协议列表及其状态。运行一些命令并获取这些数据很容易,例如;

获取服务器、输出(在本地配置文件中/从本地配置文件中设置/变量);

. ./ldap-config ; echo "$MASTER $REPLICAS"
dc1-server1 dc1-server2 dc2-server1 dc2-server2 dc3...

对于dc1-server1,获取协议,输出;

ipa-replica-manage -p $(cat ~/.dspw) list -v $SERVER.$DOMAIN | grep ': replica' | sed 's/: replica//'
dc2-server1
dc3-server1
dc4-server1

对于 dc1-server1,获取协议状态码,输出;

ipa-replica-manage -p $(cat ~/.dspw) list -v $SERVER.$DOMAIN | grep 'status: Error (' | sed -e 's/.*status: Error (//' -e 's/).*//'
0
0
18

因此输出将是基于“获取服务器”列表的几列,每个服务器下的每个“副本:状态”,对于该服务器

希望实现类似的目标;

dc2-server1: 0   dc2-server2: 0   dc1-server1: 0  ...
dc3-server1: 0   dc3-server2: 18  dc3-server1: 13 ...
dc4-server1: 18  dc4-server2: 0   dc4-server1: 0  ...

标签: bashgrid

解决方案


一般eval被认为是邪恶的。尽管如此,我还是要使用它。

paste便于并排打印文件。
在您使用文件名的地方可以使用 Bash 进程替换。

所以,我将动态构建一个粘贴命令,然后对其进行评估

我将get.sh用作您的神秘命令的占位符。

cmd="paste"

while read -ra servers; do
    for server in "${servers[@]}"; do
        cmd+=" <(./get.sh \"$server\" agreements | sed 's/\$/:/')"
        cmd+=" <(./get.sh \"$server\" status)"
    done
done < <(./get.sh servers)

eval "$cmd" | column -t

推荐阅读