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