2015-11-23 9 views
0

Я пишу сценарий, который призван помочь мне в разделении списков серверов, поэтому, когда я выпускаю новые версии продуктов компании, мне не придется беспокоить службу, а только часть серверов, изменения в разделенном списке серверов каждый раз.Как добавить остатки из раздела в последний список?

Сценарий подключается к какой-либо внутренней панели управления и вытаскивает имена хостов активных серверов (в ротации серверов), и он должен подсчитывать количество серверов и основываться на правилах, которые были определены командой, он должен делить списки для создания небольших списков для работы.

Так, например, если в определенном дата-центре содержится 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 $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 
    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 

ответ

1

кажется вам не нужно head и tail Int трубопровода, так как количество строк уже ограничено sed. Вот как вы можете добавить напоминание к последней группе:

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

Похоже, он висит на данный момент: '+ хвост -n1' –

+0

@ItaiGanot: К сожалению, я забыл вставить имя файла :-) – choroba

 Смежные вопросы

  • Нет связанных вопросов^_^