Shell练习题(3)

(1)查找字母数小于6的单词

用shell打印下面这句话中字母数小于6的单词。

Bash also interprets a number of multi-character options.

#!/bin/bash
forsinBashalsointerpretsanumberofmulti-characteroptions
do
n=`echo$s|wc-c`
if[$n-lt6]
thenecho$s
fi
done

@H_404_11@(2)输入数字执行对应命令

写一个脚本实现如下功能: 输入一个数字,然后运行对应的一个命令。显示命令如下:cmd meau* 1―date 2�Cls 3�Cwho 4�Cpwd 当输入1时,会运行date,输入2时运行ls,依此类推。

#!/bin/bash
echo"*cmdmeau**1---date2--ls3--who4--pwd"
read-p"pleaseinputanumber1-4:"n
case$nin
1)
date
;;
2)
ls
;;
3)
who
;;
4)
pwd
;;
*)
echo"Pleaseinputanumber:1-4"
;;
esac

(3)监控httpd进程

在服务器上,写一个监控脚本:

每隔10s去检测一次服务器上的httpd进程数,如果大于等于500的时候,就需要自动重启一下apache服务,并检测启动是否成功?

若没有正常启动还需再一次启动,最大不成功数超过5次则需要理解发邮件通知管理员,并且以后不需要再检测!

如果启动成功后,1分钟后再次检测httpd进程数,若正常则重复之前操作(每隔10s检测一次),若还是大于等于500,那放弃重启并需要发邮件管理员,然后自动退出该脚本。假设其中发邮件脚本为之前咱们使用的 mail.py

#!/bin/bash
check_service()
{
n=0
foriin`seq15`
do
/usr/local/apache2/bin/apachectlrestart2>/tmp/apache.err
if[$?-ne0]
then
n=$[$n+1]
else
break
fi
done
if[$n-eq5]
then
##下面的mail.py参考https://coding.net/u/aminglinux/p/aminglinux-book/git/blob/master/D22Z/mail.py
pythonmai.py"123@qq.com""httpdservicedown"`cat/tmp/apache.err`
exit
fi
}

while:
do
t_n=`ps-Chttpd--no-heading|wc-l`
if[$t_n-ge500]
then
/usr/local/apache2/bin/apachectlrestart
if[$?-ne0]
then
check_service
fi
sleep60
fi
sleep10
done

(4)封ip

需求: 根据web服务器上的访问日志,把一些请求量非常高的ip给拒绝掉!

分析: 我们要做的,不仅是要找到哪些ip请求量不合法,并且还要每隔一段时间把之前封掉的ip(若不再继续请求了)给解封。 所以该脚本的关键点在于定一个合适的时间段和阈值。

比如, 我们可以每一分钟去查看一下日志,把上一分钟的日志给过滤出来分析,并且只要请求的ip数量超过100次那么就直接封掉。 而解封的时间又规定为每半小时分析一次,把几乎没有请求量的ip给解封!

参考日志文件片段:

157.55.39.107[20/Mar/2015:00:01:24+0800]www.aminglinux.com"/bbs/thread-5622-3-1.html"200"-""Mozilla/5.0(compatible;bingbot/2.0;+http://www.bing.com/bingbot.htm)"
61.240.150.37[20/Mar/2015:00:01:34+0800]www.aminglinux.com"/bbs/search.PHP?mod=forum&srchtxt=LNMP&formhash=8f0c7da9&searchsubmit=true&source=hotsearch"200"-""Mozilla/5.0(compatible;bingbot/2.0;+http://www.bing.com/bingbot.htm)"
#!/bin/bash
logfile=/home/logs/access.log
d1=`date-d"-1minute"+%H:%M`
d2=`date+%M`
ipt=/sbin/iptables
ips=/tmp/ips.txt

block(){
grep"$d1:"$logfile|awk'{print$1}'|sort-n|uniq-c|sort-n>$ips
foripin`awk'$1>100{print$2}'$ips`;do
$ipt-IINPUT-ptcp--dport80-s$ip-jREJECT
echo"`date+%F-%T`$ip">>/tmp/badip.txt
done
}

unblock(){
foriin`$ipt-nvL--line-numbers|grep'0.0.0.0/0'|awk'$2<15{print$1}'|sort-nr`;do
$ipt-DINPUT$i
done
$ipt-Z
}

if[$d2=="00"]||[$d2=="30"];then
unblock
block
else
block
fi

(5)找规律打印数字


请详细查看如下几个数字的规律,并使用shell脚本输出后面的十个数字。

10 31 53 77 105 141 .......


试题解析:

我想大多数人都会去比较这些数字的差值:

10 31 53 77 105 141

21 22 24 28 36

但是这个差值看,并没有什么规律,而我们再仔细看的时候,发现这个差值的差值是有规律的:

10 31 53 77 105 141

21 22 24 28 36

1 2 4 8

#!/bin/bash
x=21
m=10
echo$m
foriin`seq014`;do
j=$[2**$i]
m=$[$m+$x]
echo$m
x=$[$x+$j]
done

相关文章

普通模式 >G 增加当前行到文档末尾处的缩紧层级 $ 移动到本行的末尾 . 相当于一个...
原文连接: https://spacevim.org/cn/layers/lang/elixir/ 模块简介 功能特性 启用模块 快捷键 语言专属...
原文连接: https://spacevim.org/cn/layers/lang/dart/ 模块简介 功能特性 依赖安装及启用模块 启用模...
 =   赋值操作符,可以用于算术和字符串赋值 +        加法计算     -        减法运算...
1.根据包名来查看指定的APP指定数据 adb shell "top | grep com.xxx.xxx" 由于这样打印出来的数...
ctrl+F 向下翻页 ctrl+B 向下翻页 u 取消最近一次操作 U 取消当前行的操作 ZZ 保存当前内容并退出 gg 跳...