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]# # 待续
浙公网安备 33010602011771号