我正在写一个脚本,旨在帮助我划分服务器列表,所以当我发布公司产品的新版本时,我不会打扰服务,只需要部分服务器,通过实施每次在分开的服务器列表上的更改。
脚本连接到某个内部仪表板并拉出当前活动服务器的主机名(轮换服务器),它应该计算服务器的数量,并根据团队决定的规则,它应该划分列表以创建要处理的较小列表。
因此,例如,如果某个数据中心包含35个服务器,我希望脚本将大列表划分为4个不相等的列表,或者如果有10个服务器,我希望它将大列表划分为2个小列表
大多数脚本已经可以使用了,我唯一的问题就是创建小列表。
我使用for loop
seq
命令作为计数器,直到$divider
的值,但后来我不确定如何使用相关文件填充文件来自大名单的行。
我已经尝试过的事情:
sed '1,$divider!d' big.list
- >在这种情况下,似乎我有一个 语法问题。
head -n
和tail -n
。
#!/bin/bash
site="http://10.X.X.X/dashboard/company/DCD/dcd.aspx?dcd="
tmpfile="DCD.tmp"
echo "Choose DCD:"
select DCD in 'ams2' 'ny4' 'ny4a' 'lax' 'sg' 'Quit'; do
wget $site$DCD -O $tmpfile -nv &> /dev/null
grep http $tmpfile | awk -F"<" '{print $7}' | awk -F/ '{print $3}' | grep -v '^$' | sort | awk -F: '{print $1}' > "$DCD"_active.list
# echo site: $site , DCD: $DCD
if [[ "$DCD" = "Quit" ]]; then
exit 0
fi
break
done
srvnum=$(/usr/bin/wc -l $DCD'_active.list' | awk '{print $1}')
echo "<--- List of servers: --->"
/bin/cat "$DCD"_active.list
echo "<--- Number of active servers: $srvnum --->"
if [[ $srvnum -lt "2" ]]; then
echo "Not enough servers"
elif [[ $srvnum -ge "10" ]] && [[ $srvnum -le "20" ]]; then
echo "It is recommended to divide the list by 2"
divider="2"
elif [[ $srvnum -ge "21" ]] && [[ $srvnum -le "34" ]]; then
divider="3"
echo "It is recommended to divide the list by 3"
elif [[ $srvnum -ge "35" ]]; then
echo "It is recommended to divide the list by 4"
divider="4"
fi
#echo srvnum: $srvnum
#echo divider: $divider
entries=$(echo $srvnum/$divider | bc)
echo "Each list will contain: $entries entries"
for i in $(seq $divider); do
sed '1,\$i!d' "$DCD"_active.list
#head -n$entries "$DCD"_active.list > "$DCD"_$i.list
#tail -$entries "$DCD"_active.list > "$DCD"_$i.list
done
编辑#1:
在数据中心,我正在检查10台服务器上的脚本,这意味着创建2个5台服务器列表。 在编辑脚本以包含添加的@jofel之后,确实创建了两个列表,但其中一个列表只包含第一个服务器的1行,第二个列表包含2个服务器,这些服务器是列表中的第一个和第二个,任何想法为什么?
非常感谢您的帮助。
答案 0 :(得分:1)
单引号会阻止variable substitution
。您应该使用双引号sed
。而且您还希望将sed
输出(每次计算开始和结束时)重定向到文件。
for i in $(seq $divider); do
first=$(((i-1)*(srvnum/divider)+1))
last=$((i*(srvnum/divider)))
sed "$first,$last!d" "$DCD"_active.list > "$DCD"_$i.list
done
modulo=$((srvnum%divider ))
if [[ $modulo -ne 0 ]]; then
first=$((srvnum-modulo+1))
sed "$first,$srvnum!d" "$DCD"_active.list > "$DCD"_$((divider+1))".list"
fi