2015-11-23 75 views
0

我正在編寫一個腳本,旨在幫助我劃分服務器列表,因此當我發佈公司產品的新版本時,我不會打擾服務,但只有一部分服務器,通過實施每次都在服務器列表中進行更改。如何劃分列表並將劃分的值打印到不同的文件?

該腳本連接到一些內部儀表板,並提取當前活動服務器(服務器輪換)的主機名,它應該計算服務器的數量,並根據團隊決定的規則,它應該劃分列表來創建更小的列表來處理。例如,如果某個數據中心包含35個服務器,我希望腳本將大列表分成4個不等於列表,或者如果有10個服務器,我希望它將大列表分成2個小的列表名單。

大部分腳本已經工作了,唯一的問題是創建小列表。

我使用for loopseq命令作爲計數器,直到$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個服務器的腳本,這意味着5個的服務器2所列出創建。 編輯腳本以包含添加的更改@jofel後,確實創建了兩個列表,但其中一個列表僅包含第一個服務器的一行,第二個列表包含兩個列表中的第一個和第二個服務器,任何想法爲什麼?

非常感謝您的幫助。

回答

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 
+0

你能解釋一下你在$ first和$ last做了什麼嗎? –

+1

因爲在for循環的每一步中都從** active.list **中提取了一大塊子列表。所以你應該計算每個子列表的開始和結束數字。例如,如果'srvnum'是11,'divider'是2,那麼5個子列表是(1,2)(3,4)(5,6)(7,8)(9,10),還有剩餘的數字例子11)應該被考慮。請參閱'modulo' @ itai-ganot – Kadir

+0

非常感謝您的解釋。 –