如何划分列表并将划分的值打印到不同的文件?

时间:2015-11-23 11:31:42

标签: bash sed

我正在写一个脚本,旨在帮助我划分服务器列表,所以当我发布公司产品的新版本时,我不会打扰服务,只需要部分服务器,通过实施每次在分开的服务器列表上的更改。

脚本连接到某个内部仪表板并拉出当前活动服务器的主机名(轮换服务器),它应该计算服务器的数量,并根据团队决定的规则,它应该划分列表以创建要处理的较小列表。

因此,例如,如果某个数据中心包含35个服务器,我希望脚本将大列表划分为4个不相等的列表,或者如果有10个服务器,我希望它将大列表划分为2个小列表

大多数脚本已经可以使用了,我唯一的问题就是创建小列表。

我使用for loop seq命令作为计数器,直到$divider的值,但后来我不确定如何使用相关文件填充文件来自大名单的行。

我已经尝试过的事情:

  

sed '1,$divider!d' big.list - >在这种情况下,似乎我有一个   语法问题。

     

head -ntail -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个服务器,这些服务器是列表中的第一个和第二个,任何想法为什么?

非常感谢您的帮助。

1 个答案:

答案 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