如何将分区的剩菜添加到最后一个列表?
How do add leftovers from division to the last list?
我正在编写一个脚本,旨在帮助我划分服务器列表,这样当我发布公司产品的新版本时,我不必干扰服务,而只需干扰一部分服务器,通过每次在服务器的划分列表上实施更改。
该脚本正在连接到一些内部仪表板并提取当前活动服务器(轮流服务器)的主机名,它应该计算服务器的数量并根据团队决定的规则,它应该划分列表以创建更小的列表来处理。
因此,例如,如果某个数据中心包含 35 个服务器,我希望脚本将大列表划分为 4 个不相等的列表,或者如果有 10 个服务器,我希望脚本将大列表划分为 2 个小清单。
大部分脚本已经可以工作了,我唯一的问题是在某些站点有 38 个服务器,它们适用于除以 4 的规则。
问题是 38 可以被 4 整除。似乎在我编写脚本的方式中,剩余部分被忽略了。
我想把剩下的添加到最后一个列表中,怎么办?
这是脚本:
#!/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 }' | awk -F/ '{print }' | grep -v '^$' | sort | awk -F: '{print }' > "$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 }')
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
first=$(((i-1)*(srvnum/divider)+1))
last=$((i*(srvnum/divider)))
sed "$first,$last!d" "$DCD"_active.list | head -n$entries | tail -$entries > "$DCD"_$i.list
done
echo "Deleting temporary files..."
rm -f "$DCD"_active.list $tmpfile
您似乎不需要 head
和 tail
管道,因为行数已经受到 sed
的限制。以下是将提醒添加到最后一组的方法:
tail -n$(( srvnum % divider )) "$DCD"_active.list >> "$DCD"_$divider.list
我正在编写一个脚本,旨在帮助我划分服务器列表,这样当我发布公司产品的新版本时,我不必干扰服务,而只需干扰一部分服务器,通过每次在服务器的划分列表上实施更改。
该脚本正在连接到一些内部仪表板并提取当前活动服务器(轮流服务器)的主机名,它应该计算服务器的数量并根据团队决定的规则,它应该划分列表以创建更小的列表来处理。
因此,例如,如果某个数据中心包含 35 个服务器,我希望脚本将大列表划分为 4 个不相等的列表,或者如果有 10 个服务器,我希望脚本将大列表划分为 2 个小清单。
大部分脚本已经可以工作了,我唯一的问题是在某些站点有 38 个服务器,它们适用于除以 4 的规则。
问题是 38 可以被 4 整除。似乎在我编写脚本的方式中,剩余部分被忽略了。
我想把剩下的添加到最后一个列表中,怎么办?
这是脚本:
#!/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 }' | awk -F/ '{print }' | grep -v '^$' | sort | awk -F: '{print }' > "$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 }')
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
first=$(((i-1)*(srvnum/divider)+1))
last=$((i*(srvnum/divider)))
sed "$first,$last!d" "$DCD"_active.list | head -n$entries | tail -$entries > "$DCD"_$i.list
done
echo "Deleting temporary files..."
rm -f "$DCD"_active.list $tmpfile
您似乎不需要 head
和 tail
管道,因为行数已经受到 sed
的限制。以下是将提醒添加到最后一组的方法:
tail -n$(( srvnum % divider )) "$DCD"_active.list >> "$DCD"_$divider.list