该命令ads2 cls create
产生以下输出:
cluster established ...
nodes {
node {
name = "fdt-c-agx-0002";
address = "http://172.16.11.89:9011/";
state = "3";
}
node {
name = "FDT-C-VM-0094";
address = "http://172.16.11.49:9011/";
state = "3";
}
}
我试图找到name
每个节点及其状态,将每个节点分配给一个变量并打印它们,以便输出如下所示:
NODE-1name
有一个状态state
#这符合第一个节点
NODE-2name
有一个状态state
#这符合第二个节点
因此我从 grep like status-nod1="$(ads2 cls create | grep state | cut -d '"' -f 2)"
&开始name-nod1="$(ads2 cls create | grep name | cut -d '"' -f 2)"
。
这是可行的,但是会找到所有与state
“名称”匹配的内容,因此返回
3
3
fdt-c-agx-0002
FDT-C-VM-0094
那么我怎样才能按写入顺序输出匹配项,以便每个节点都与其状态匹配
答案1
这不是最有效的代码,但是它可以完成工作。
#! /bin/bash
mapfile -t name < <(ads2 cls create | grep -Po "name = \"\K.*(?=\")")
mapfile -t state < <(ads2 cls create | grep -Po "state = \"\K.*(?=\")")
a=0
while [[ $a -gt -1 ]]
do
echo "NODE-$(echo $a+1 | bc) ${name[$a]} has the state ${state[$a]}"
a=$((a+1))
if [[ -z ${name[$a]} ]]
then
a=-2
fi
done
将其粘贴到.sh
文件中(例如node_status.sh
),使其可执行(sudo chmod a+x node_status.sh
)然后运行它(path/to/script/node_status.sh
或者./node_status.sh
如果您在脚本所在的目录中)。此脚本的优点是,当您添加节点(NODE-3 NODE-4 等)时,脚本可以处理该问题,并将为您提供每个节点(而不仅仅是前两个)的名称和状态。您可以有 100 个节点,它将提供所有 100 个节点的名称和状态。