xie-wen-hui
船帆虽小,却也能远航!

shell编程练习100题(一)

1、 用户输入指定路径,在该路径下生成一个以当前时间为名字的.log文件,把系统磁盘使用情况写入到该文件
[root@localhost home]# cat file
#!/bin/bash
# 该脚本是为了收集系统磁盘使用情况

read -p "请输入要创建日志的文件路径:" path

if [ ! -d "$path" ];then

	mkdir -p "$path"
fi

df -h > $path/$(date +%F).log

# mtime:最后一次修改文件内容的时间,+365:一年前 xargs:多行变一行
find  $path/ -mtime +365 |xargs rm -rf

2、统计日志1.log文件里每个ip访问的次数:

1.log文件内容如下:

112.111.12.248 – [25/Sep/2013:16:08:31 +0800]formula-x.haotui.com “/seccode.php?update=0.5593110133088248″ 200″http://formula-x.haotui.com/registerbbs.php” “Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1;)”
61.147.76.51 – [25/Sep/2013:16:08:31 +0800]xyzdiy.5d6d.com “/attachment.php?aid=4554&k=9ce51e2c376bc861603c7689d97c04a1&t=1334564048&fid=9&sid=zgohwYoLZq2qPW233ZIRsJiUeu22XqE8f49jY9mouRSoE71″ 301″http://xyzdiy.5d6d.com/thread-1435-1-23.html” “Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)”
[root@localhost home]# awk  '/([0-9].){3}[0-9]/{print $1}' 1.log |sort |uniq -c | sort -nr | awk "{print $2 $1}"
      1 61.147.76.51
      1 112.111.12.248
3、计算出系统当前所有进程的占用内存总数
[root@localhost home]# cat 1.txt 
#!/bin/bash
#unset sum 
#unset a
#unset i

sum=0
for i in $( ps -aux |grep -v 'TIME COMMAND'| awk '{print $6}' ); 
do
   sum=$[ $sum+$i ]
done;
  echo $sum

[root@localhost home]# bash 1.txt 
1479724

4、检查主机是否存活的shell脚本
#!/bin/bash

ip-inspect(){
        PREFIX=192.168.1
        numb1=1

        while [[ $numb1 -lt "255" ]];
        do
                echo -en "正在对ip:${PREFIX}.${numb1}进行检测中....."
                ping -c1 -w1 -t5 ${PREFIX}.${numb1} >/dev/null 2>&1
                if [[ $? -eq 0 ]]
                then
                        echo "${PREFIX}.${numb1} is OK" && echo  ${PREFIX}.${numb1} >> /home/ip-ok.txt

        else
                echo "${PREFIX}.${numb1} is fail" && echo ${PREFIX}.${numb1} >> /home/ip-fail.txt
        fi
        let numb1=$numb1+1

        done
}
ip-inspect                                                                                      

5、公司抽奖脚本

  • 随机产生1000个以182开头的号码到phone中

  • 在这1000个人中抽取10个幸运观众,号码以182****后4位结尾的方式显示在大屏幕

    [root@localhost home]# cat random
    #!/bin/bash
    # 以182开头随机产生1000个号码,存储到phone文件中
    # 在1000个好号码中随机抽取10个幸运观众的号码,并以182****后4位方式显示
    
    # 1.使用循环嵌套$[$RANDOM%10]方式产生1000个随机号码
    # 2.确定号码个数,定位号码行数,截取后4位号码,并把该幸运号码存储到lucky-phone文# 件中
    touch /home/phone
    make-phone(){
     if [ $(wc -l /home/phone | cut -d" " -f1) -le 990 ];then
         sed -i '1,$d' /home/phone 
         for ((i=1;i<=$1;i++))
         do	
       	num1=$[RANDOM%10]
    	num2=$[RANDOM%10]
    	num3=$[RANDOM%10]
    	num4=$[RANDOM%10]
    	num5=$[RANDOM%10]
    	num6=$[RANDOM%10]
    	num7=$[RANDOM%10]
    	num8=$[RANDOM%10]
    	echo "182$num1$num2$num3$num4$num5$num6$num7$num8" >> /home/phone
    
         done
         
     fi
    }
    make-phone 1000
    echo "18270090918" >> /home/phone
    echo "18270090918" >> /home/phone
    echo "18270090919" >> /home/phone
    echo "18270090919" >> /home/phone
    #33
    #重复的号码
    #phone1=$(cat /home/phone | sort | uniq -d)
    #echo "重复的号码为:${phone1}"
    
    # 有几个重复的号码
    #phone2=$(cat /home/phone |sort |uniq -cd | awk '{print $1}')
    #echo "有${phone2}个重复的号码"
    
    #重复号码的行号
    #c=$(cat /home/phone | sort | grep -n "$phone1" | awk -F":" '{print $1}')
    #echo "重复号码的行号:${c}"
    #echo "开始.............."
    if [[ -n $(cat /home/phone | sort | uniq -d) ]]
    then
    
    	for i in $(cat /home/phone | sort | uniq -d)
    	do	
    		sed -i "/$i/d" phone
    		echo "$(cat phone | awk "NR==$i")" >> /home/chong-fu		
    	
    	done
    	make-phone $(cat /home/phone |sort |uniq -cd | awk '{print $1}')
    	
    #59
    
    fi
    
    echo "抽奖开始..............."
    for ((i=1;i<=10;i++))
    do
    	
    	line=$(wc -l /home/phone | cut -d' ' -f1)
    	
    	luck_line=$[RANDOM%$line+1]
    
    	#luck_numb= `cat /home/phone | awk "NR==$luck_line{print}"`
    	#我用上面这个命令去获取号码执行会报错,不知道为什么
    	luck_num=`head -$luck_line /home/phone |tail -1`
    		
    	echo "第$i次的幸运观众号码为:182****${luck_num:7:4}"
    	echo $luck_num >> /home/luck-phone	
    	sed -i "/$luck_num/d" /home/phone
    
    
    
    done
    echo "此次抽已结束"
    [root@localhost home]# 
    
    
    # 待续
    
posted on 2021-01-17 14:26  xie-wen-hui  阅读(1175)  评论(0)    收藏  举报