唯一的集群名称

唯一的集群名称

我们有多个集群服务器,需要检查每个集群中的 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

相关内容