shell训练计划30天之第二十三天

例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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值