shell习题-27
题目要求
要求:两类机器一共300多台,写个脚本自动清理这两类机器里面的日志文件。在堡垒机批量发布,也要批量发布到crontab里面。 A类机器日志存放路径很统一,B类机器日志存放路径需要用匹配(因为这个目录里除了日志外,还有其他文件,不能删除。匹配的时候可用.log) A类:/opt/cloud/log/ 删除7天前的 要求写在一个脚本里面。不用考虑堡垒机上的操作,只需要写出shell脚本。 参考答案#!/bin/bash #这个脚本用来删除老日志 #作者:猿课-阿铭 www.apelearn.com #日期:2018-12-12 dir1=/opt/cloud/log/ dir2=/opt/cloud/instance/ if [ -d $dir1 ] then find $dir1 -type f -mtime +7 |xargs rm elif [ -d $dir2 ] then find $dir2 -name "*.log" -type f -mtime +15 |xargs rm fi 题目要求贷款有两种还款的方式:等额本金法和等额本息法,简单说明一下等额本息法与等额本金法的主要区别: 等额本息法的特点是:每月的还款额相同,在月供中“本金与利息”的分配比例中,前半段时期所还的利息比例大、本金比例小,还款期限过半后逐步转为本金比例大、利息比例小。所支出的总利息比等额本金法多,而且贷款期限越长,利息相差越大。 两种还款方式的比较不是我们今天的讨论范围,我们的任务就是做一个贷款计算器。其中: 参考答案#!/bin/bash #这个脚本用来实现简易的房贷计算器 #作者:猿课-阿铭 www.apelearn.com #日期:2018-12-12 read -p "请输入贷款总额(单位:万元):" sum_w read -p "请输入贷款年利率(如年利率为6.5%,直接输入6.5):" y_r read -p "请输入贷款年限(单位:年):" y_n echo "贷款计算方式:" echo "1)等额本金计算法" echo "2)等额本息计算法" read -p "请选择贷款方式(1|2)" type #贷款总额 sum=`echo "scale=2;$sum_w*10000 " | bc -l` #年利率 y_r2=`echo "scale=6;$y_r/100 " | bc -l` #月利率 m_r=`echo "scale=6;$y_r2/12 " | bc -l` #期数 count=$[$y_n*12] echo "期次 本月还款额 本月利息 未还款额" jin() { #月还款本金m_jin=贷款总额sum/期数count m_jin=`echo "scale=2;($sum/$count)/1 " | bc -l` #定义未还本金r_jin(第一期应该是贷款总额) r_jin=$sum for((i=1;i<=$count;i++)) do #本月利息m_xi=剩余本金*月利率 m_xi=`echo "scale=2;( $r_jin*$m_r)/1"|bc -l` #本月还款m_jinxi=月还本金m_jin+本月利息m_xi m_jinxi=`echo "scale=2;( $m_jin+$m_xi)/1"|bc -l` #已还款本金jin=月还本金m_jin*期数i jin=`echo "scale=2;( $m_jin*$i)/1"|bc -l` #剩余本金r_jin=贷款总额sum-已还本金jin r_jin=`echo "scale=2;( $sum-$jin)/1"|bc -l` if [ $i -eq $count ] then #最后一月的还款额应该是每月还款本金+本月利息+剩余本金 m_jinxi=`echo "scale=2;( $m_jin+$r_jin+$m_xi)/1"|bc -l` #最后一月的剩余本金应该是0 r_jin=0 fi echo "$i $m_jinxi $m_xi $r_jin" done } xi() { #每期还款m_jinxi=(贷款总额sum*月利率m_r*((1+月利率m_r)^期数count))/(((1+月利率m_r)^期数count)-1) m_jinxi=`echo "scale=2;(($sum*$m_r*((1+$m_r)^$count))/(((1+$m_r)^$count)-1))/1 " | bc -l` #定义未还本金r_jin(第一期应该是贷款总额) r_jin=$sum for((i=1;i<=$count;i++)) do #本期利息m_xi=剩余本金r_jin*月利率m_r m_xi=`echo "scale=2;( $r_jin*$m_r)/1"|bc -l` #本期本金m_jin=本期本息m_jinxi-本期利息m_xi m_jin=`echo "scale=2;($m_jinxi-$m_xi)/1 " | bc -l` #未还本金r_jin=上期未还本金r_jin-本期应还本金m_jin r_jin=`echo "scale=2;($r_jin-$m_jin)/1 " | bc -l` if [ $i -eq $count ] then #最后一月本息m_jinxi=本期本金m_jin+未还本金r_jin m_jinxi=`echo "scale=2;($m_jin+$r_jin)/1 " | bc -l` #最后一月的剩余本金应该是0 r_jin="0.00" fi echo "$i $m_jinxi $m_xi $r_jin" done } case $type in 1) jin ;; 2) xi ;; *) exit 1 ;; esac 题目要求阿里云的机器,今天收到客服来的电话,说服务器的磁盘io很重。于是登录到服务器查看,并没有发现问题,所以怀疑是间歇性地。正要考虑写个脚本的时候,幸运的抓到了一个线索,造成磁盘io很高的幕后黑手是mysql。此时去show processlist,但未发现有问题的队列。原来只是一瞬间。只好继续来写脚本,思路是,每5s检测一次磁盘io,当发现问题去查询mysql的processlist。 参考答案#!/bin/bash #这个脚本用来监控磁盘IO #作者:猿课-阿铭 www.apelearn.com #日期:2018-12-12 if ! while iostat &>/dev/null then yum install -y sysstat fi while : do t=`date +%T` iostat -xd 1 5 |grep ‘^sda‘> /tmp/io.log sum=`awk ‘{sum=sum+$NF} END {print sum}‘ /tmp/io.log` a=`echo "scale=2;$sum/5"|bc` b=`echo $a|cut -d . -f 1` if [ $b -gt 90 ] then mysql -uroot -pxxxx -e "show processlist" > mysql_$t.log fi sleep 1 done 题目要求写一个截取tomcat catalina.out日志的脚本 # find /opt/TOM/ -name catalina.out /opt/TOM/t1/logs/catalina.out /opt/TOM/t3/logs/catalina.out /opt/TOM/t4/logs/catalina.out /opt/TOM/t2/logs/catalina.out 要求:
参考答案#!/bin/bash #这个脚本用来查看Tomcat日志 #作者:猿课-阿铭 www.apelearn.com #日期:2018-12-12 LANG=en logfile="/opt/TOM/$1/logs/catalina.out" #将当天的英文月、数字日期、数字年作为变量赋值给d_mdy d_mdy=`date "+%b %d,%Y"` #判断参数个数 if [ $# -ne 2 ] && [ $# -ne 3 ] then echo "你提供的参数个数不对,请提供2个或者3个参数。例:sh $0 t1 08:01:00 14:00:00" exit 1 fi #判断第一个参数是否符合要求 if ! echo $1|grep -qE ‘^t1$|^t2$|^t3$|^t4$‘ then echo "第一个参数必须是t1、t2、t3或t4" exit 1 fi #判断时间有效性 judge_time() { date -d "$1" +%s &>/dev/null if [ $? -ne 0 ] then echo "你提供的时间$1格式不正确" exit 1 fi } #将24小时制时间转换为12小时 tr_24_12() { date -d "$1" +%r } #判断提供的时间点是否在日志中出现 judge_time_in_log() { if ! grep -q "$d_mdy $(tr_24_12 $1)" $logfile then echo "你提供的时间$1在日志$logfile中不曾出现,请换一个时间点" exit 1 fi } #判断第2个参数是否合法 judge_time $2 #判断起始时间点是否出现在日志里 judge_time_in_log $2 #如果提供第3个参数 if [ $# -eq 3 ] then #判断第3个参数是否合法 judge_time $3 #判断起始时间是否早于结束时间 t1=`date -d "$2" +%s` t2=`date -d "$3" +%s` if [ $t2 -lt $t1 ] then echo "你提供的时间$2比$3要晚,应该把早的时间放到前面" exit fi #判断提供的结束时间点是否出现在日志中 judge_time_in_log $3 fi #取起始时间所在行行号 begin_n=`grep -n "$d_mdy $(tr_24_12 $2)" $logfile|head -1|awk -F ‘:‘ ‘{print $1}‘` #取结束时间所在行行号,并用sed截取日志内容 if [ $# -eq 3 ] then n=`grep -n "$d_mdy $(tr_24_12 $3)" $logfile|tail -1|awk -F ‘:‘ ‘{print $1}‘` #结束日期所在行的下一行才是日志的内容 end_n=$[$n+1] sed -n "$begin_n,$end_n"p $logfile else sed -n "$begin_n,$"p $logfile fi 题目要求写一个脚本让用户输入多个城市的名字(可以是中文),要求不少于5个,然后把这些城市存到一个数组里,最后用for循环把它们打印出来。 参考答案#!/bin/bash #这个脚本用来打印城市名字 #作者:猿课-阿铭 www.apelearn.com #日期:2018-12-12 read -p "输入不少于5个城市的名字,用空格分隔开。" name n=`echo $name|awk ‘{print NF}‘` if [ $n -lt 5 ] then echo "请输入至少5个城市的名字." exit fi city=($name) for i in `seq 0 $[${#city[@]}-1]` do echo ${city[$i]} done 题目要求需求背景是: 写一个shell脚本,把A服务器上的变更代码同步到B和C上。 参考答案#!/bin/bash #这个脚本用来代码上线 #作者:猿课-阿铭 www.apelearn.com #日期:2018-12-12 dir=/data/wwwroot/www.aaa.com B_IP=1.1.1.1 C_IP=2.2.2.2 rs() { rsync -azP --exclude="logs" --exclude="tmp" --exclude="upload" --exclude="caches" $dir/ $1:$dir/ } read -p "该脚本将会把本机的$dir下的文件同步到$B_IP和$C_IP上,是否要继续?y|n" c case $c in y|Y) rs B_IP rs C_IP ;; n|N) exit ;; *) echo "你只能输入y或者n." ;; esac (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |