我们有多个集群服务器,需要检查每个集群中的 1 台服务器。如何比较列表中的条目以仅返回每个集群中的一台服务器?所有服务器名称均遵循 [az]-[az]-[az][0-9].domain_name
服务器列表示例。
test-rac-1.domain_name
test-rac-2.domain_name
test-rac-3.domain_name
test-rac-dg1.domain_name
test-rac-dg2.domain_name
test-rac-dg3.domain_name
qat-rac-1.domain_name
qat-rac-2.domain_name
qat-rac-3.domain_name
ser-ser-ser.domain_name
long-serv-name.domain_name
结果服务器列表。
test-rac-1.domain_name
test-rac-dg1.domain_name
qat-rac-1.domain_name
ser-ser-ser.domain_name
long-serv-name.domain_name
-- 结果可以是集群中的任何服务器。
答案1
您可以使用正则表达式使用 grep 过滤所有行。
grep '[a-z-]1\?\.domain_name' file > newfile
1
这将返回所有在“.domain_name”之前带有字母或减号以及可选的行。
逆操作是删除“.domain_name”之前包含数字 > 1 的所有行:
grep -v '\([2-9]\|[0-9]1\)\.domain_name' file > newfile
这会匹配“.domain_name”之前最后一位数字为 2 到 9 的行,或者最后一位数字至少有两位的数字1
(以匹配 11 或 21 等)。该-v
选项用于选择不匹配的行。
答案2
如果您不能确定每个集群都包含编号为 的主机1
,则需要跟踪您已经看到的集群。在awk
(除其他外)中,您可以使用关联数组来做到这一点:
awk '{o=$0; sub(/[0-9]+/,"",o)} !a[o]++ {print}' file
答案3
Freddy 的答案仅给出了每个节点的第一个节点。虽然这可能就是您所需要的,但它会从每个集群中随机选择一个节点。
# iterate through unique list of cluster stub names, assuming a digit marks the node number
for cluster in $(sed -e 's/.domain_name//' serverlist|tr -d '[[:digit:]]'|sort -u)
do
# for this cluster, get the list of all node names if indexed
nodes=( $(grep $cluster'[[:digit:]]' serverlist) )
# if there wasn't a match it's because it's a cluster of one without a node number
if (( ${#nodes[@]} == 0 )); then
# cluster of one
echo $cluster
else
# pick a random number from 1 to number of nodes
# subtract one to make it an array index
n=$(( $(shuf -i"1-${#nodes[@]}" -n1) -1 ))
echo ${nodes[$n]}
fi
done