如何将分区的剩菜添加到最后一个列表?

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

您似乎不需要 headtail 管道,因为行数已经受到 sed 的限制。以下是将提醒添加到最后一组的方法:

tail -n$(( srvnum % divider )) "$DCD"_active.list >> "$DCD"_$divider.list