shell實戰訓練營Day23

在文本文檔1.txt第5行(假設文件行數大於5)後面增加如下內容:
#This is a test file.
#Test insert line into this file.

#!/bin/bash
n=0
cat 1.txt |while read line
do
n=$[$n+1]
if [ $n -eq 5 ]
then
echo $line
echo -e "# This is a test file.\n# Test insert line into this file."
else
echo $line
fi
done

設計一個shell程序,在每月第一天備份並壓縮/etc目錄的所有內容,存放在/root/bak目錄裏,且文件名爲如下形式"yymmdd_etc.tar.gz",yy爲年,mm爲月,dd爲日。

#!/bin/bash
d1=date +%d
d2=date +%y%m%d
if [ $d1 == "01" ]
then
cd /etc/
tar czf /root/bak/$d2_etc.tar.gz ./
fi

將文件內所有的單詞的重複次數計算出來,只需要列出重複次數最多的10個單詞
#!/bin/bash
for w in sed 's/[^a-zA-Z]/ /g' $1
do
echo $w
done |sort |uniq -c |sort -nr|head

需求是,把所有的成員平均分成若干個小組。這裏,提供一個人員列表,比如成員有50人,需要分成7個小組,要求隨機性,每次和每次分組的結果應該不一致。

#!/bin/bash
#人員列表文件
f=member.txt
#小組數
group_n=7
#人員總數
member_n=wc -l $f|awk '{print $1}'

#根據姓名計算該用戶所在小組的id
get_n()
{
#根據姓名計算cksum值
l=echo $1|cksum|awk '{print $1}'
#獲取一個隨機數
n1=$RANDOM
#cksum值和隨機數相加,然後除以小組數取餘,這樣可以確保每次獲取到的餘數都不一樣
n2=$[$n1+$l]
g_id=$[$n2%$group_n]
#假如小組數爲7,則餘數範圍0-6,如果餘數爲0,則小組爲7
if [ $g_id -eq 0 ]
then
g_id=$group_n
fi
echo $g_id
}

for i in seq 1 $group_n
do
#n$i.txt爲臨時文件,用來記錄該小組內的成員
#腳本之前執行過,則該文件會存在,本次執行腳本前應該刪除掉這個臨時文件
[ -f n
$i.txt ] && rm -f n_$i.txt
done

shuf $f|while read name
do
#計算用戶所在小組的id
g=get_n $name
#將人員追加寫入到他對應的小組裏
echo $name >> n_$g.txt
done

#定義計算文件行數的函數
nu(){
wc -l $1|awk '{print $1}'
}

#獲取組員人數最多的小組
max(){
ma=0
for i in seq 1 $group_n|shuf
do
n=nu n_$i.txt
if [ $n -gt $ma ]
then
ma=$n
fi
done
echo $ma
}

#獲取組員人數最少的小組
min(){
mi=$member_n
for i in seq 1 $group_n|shuf
do
n=nu n_$i.txt
if [ $n -lt $mi ]
then
mi=$n
fi
done
echo $mi
}

#定義四捨五入函數
div()
{
n=echo "scale=1;$1/$2"|bc
n1=echo "scale=1;$n+0.5"|bc
echo $n1|cut -d. -f1
}

#小組組員平均值(非四捨五入)
ava_n=$[$member_n/$group_n]
#小組組員平均值(四捨五入)
ava_n1=div $member_n $group_n

if [ $ava_n -eq $ava_n1 ]
then
#定義初始最小值
ini_min=1
#以下while循環要做的事情,就是要把人數多的組裏的人搞到人數少的組裏去
#此while循環的條件是,當人數最少的組成員數小於組員平均值
while [ $ini_min -lt $ava_n1 ]
do
#找出人數最多的組
m1=max
#找出人數最少的組
m2=min
for i in seq 1 $group_n|shuf
do
n=nu n_$i.txt
#找到人數最多的組對應的文件f1(可能有多個,這裏取出現的第一個即可)
if [ $n -eq $m1 ]
then
f1=n$i.txt
#找到人數最少的組對應的文件f2(可能有多個,這裏取出現的第一個即可)
elif [ $n -eq $m2 ]
then
f2=n
$i.txt
fi
done
#取f1中最後一個人名
name=tail -n1 $f1
#將這個人名追加寫入f2中
echo $name >> $f2
#在f1中刪除剛剛取走的人名
sed -i "/$name/d" $f1
#把此時的最少組人員數賦值給ini_min
ini_min=min
done
else
#定義初始最大值
ini_max=$member_n
while [ $ini_max -gt $ava_n1 ]
do
#找出人數最多的組
m1=max
#找出人數最少的組
m2=min
for i in seq 1 $group_n|shuf
do
n=nu n_$i.txt
#找到人數最多的組對應的文件f1(可能有多個,這裏取出現的第一個即可)
if [ $n -eq $m1 ]
then
f1=n$i.txt
#找到人數最少的組對應的文件f2(可能有多個,這裏取出現的第一個即可)
elif [ $n -eq $m2 ]
then
f2=n
$i.txt
fi
done
#取f1中最後一個人名
name=tail -n1 $f1
#將這個人名追加寫入f2中
echo $name >> $f2
#在f1中刪除剛剛取走的人名
sed -i "/$name/d" $f1
#把此時的最少組人員數賦值給ini_min
ini_max=max
done
fi

for i in seq 1 $group_n
do
echo -e "\033[34m$i 組成員有:\033[0m"
cat n$i.txt
#把臨時文件刪除
rm -f n
$i.txt
echo
done

寫一個shell腳本,比較兩個數的大小,支持浮點數,兩個數通過shell參數的形式提供。
#!/bin/bash
if [ $# -ne 2 ]
then
echo "請提供兩個參數."
exit
fi

if_number()
{
if echo $1|grep -q '^-'
then
nu=echo $1|sed 's/^-//'
else
nu=$1
fi
n=echo $nu|sed 's/[0-9.]//g'
if [ -n "$n" ]
then
echo "$1不是合法數字."
exit
fi
if echo $1|grep -q '^.'
then
echo "$1不是合法數字."
exit
fi
}

if_number $1
if_number $2

n1=echo "$1>$2"|bc
if [ $n1 -eq 1 ]
then
echo "$1 > $2"
else
if [ "$1" == "$2" ]
then
echo "$1 = $2"
else
echo "$1 < $2"
fi
fi

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章