例56 给文件增加内容
要求:在文本文档1.txt第5行(假设文件行数大于5)后面增加如下内容:
#This is a test file
#Test insert line into this file
要点:
给文档指定行后面增加内容,可以使用sed搞定
比较笨的方法是,一次按顺序打印前5行,单后打印要增加的行,再从文本第六行开始一直到结束依次打印剩余的行
#!/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
例57 备份etc目录
要求:设计一个shell程序,在每月第一天备份并压缩/etc目录的所有内容,存放在/root、bak目录里,且文件名为如下形式“yymmdd_etc.tar.gz”yy为年,mm为月,dd为日
要点
1.用yymmdd用date+%y%m%d表示
2.每月第一天,需要判断date+%d是否为01
#!/bin/bash
d1=`date +%d`
d2=`date +%y%m%d`
if [ $a == "01" ]
then
ce /etc/
tar czf /root/bak/$d2_etc.tar.gz ./
fi
例58 找出重复的单词
要求:将文件内所有的单词重复计次计算出来,只需要列出重复次数最多的单词
要点:把非因为的字符删掉(用空格替换),剩下的就是英文字母或者单词
#!/bin/bash
d1=`date +%d`
d2=`date +%y%m%d`
if [ $a == "01" ]
then
ce /etc/
tar czf /root/bak/$d2_etc.tar.gz ./
fi
例59 人员分组
要求:需求是,把所有的成员平均分成若干个小组。这里,提供一个人员列表,比如成员有50个人,需要分成7个小组,要求随机性,每次和每次分组的结果不应该一致
要点:首先确定好要分的小组个数,本题中假设有50人,分7个小组,平均每个小组个数应为7
为了实现随机性,我们可以根据人名的长度来做一个运算,比如用一个随机数+人名的长度得到一个随机数,然后除以7取余数,余数是几就把该用户分到第几组里
考虑到人员数量较少,最终分组结果一定不平衡,比如有的小组分类10个人,有的小组只有三个人,这样严重不均衡
4.为了让人员更加均衡,需要把人数偏多的组(大于7的)均分一部分成员到人数偏少的组(小于7的)
#!/bin/bash
f=member.txt
group_n=7
member_n=`wc -l $f|awk '{print $1}'`
get_n()
{
l=`echo $1 | cksum|awk '{print $1}'`
n1=$RANDOM
n2=$[$n1+$l]
g_id=$[$n1%group_n]
if [ $g_id -eq 0 ]
then
g_id=$group_n
fi
echo $g_id
}
for i in `seq 1 $group_n`
do
[ -f n_$i.txt ] && rm -f n_$i.txt
done
shuf $f | while read name
do
g=`get_n $name`
echo $name >> n_$g.txt
done
nu(){
wc -l $11|awa '{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
}
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 "scake-1;$n+0.5"|bc}`
echo $n1|cut -d. -f1
}
ava_n1=`dev $member_n $group_n`
if [ $ava_n -eq $ava_n1 ]
then
ini_men=1
while [ $ini_min -lt $ava_n1 ]
do
m1=`max`
m2=`min`
for i in `seq 1 $group_m|shuf`
do
n=`nu n_$i.txt`
if [ $n -eq $m1]
then
f1=n_$i.txt
elif [ $n -eq $m2]
then
f2=n_$i.txt
fi
done
name=`tail -n1 $f1`
echo $name >> $f2
sed -i "/$name/d" $f1
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`
if [ $n -eq $m1 ]
then
f2=n_$i.txt
fi
done
name=`tail -n1 $f1`
echo $name >> $f2
sed -i "/$name/d" $f1
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
例60 比较两个数的大小
要求写一个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
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
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