고유한 클러스터 이름

고유한 클러스터 이름

여러 개의 클러스터된 서버가 있고 각 클러스터에서 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

관련 정보