2019独角兽企业重金招聘Python工程师标准>>>

如何让系统的时间同步

51、题目要求  :  判断网站是否正常

写一个shell脚本,通过curl -I 返回的状态码来判定所访问的网站是否正常。 比如,当状态码为200时,才算正常。

【核心要点】

curl -l url

如何截取状态吗

参考答案

#!/bin/bash
#这个脚本用来判断一个网址是否正常
#作者:猿课-阿铭 www.apelearn.com
#日期:2018-11-01url="http://www.apelearn.com/index.php"
mail_user=3067986058@qq.comcode=`curl -I $url 2>/tmp/curl.err|head -1|awk '{print $2}'`
if [ -z "$code" ]
thenpython mail.py $mail_user "$url访问异常" "`cat /tmp/curl.err`"exit
elif [ $code != "200" ]
thencurl -I $url &> /tmp/curl.logpython mail.py $mail_user "$url访问异常 状态码$code" "`/tmp/curl.log`"
fi

实例 :

通过curl -I 返回的状态码来判定所访问的网站正常

将错误的输出重定向到/dev/null,只显示状态码

脚本执行的结果

注意  :

elif [ $code != "200" ]                  #当code不等于200时

if [ -z "$code" ]                        #当-z为空。

因为本脚本中没有mail.py脚本,所以错误的网址,就不能记录到/tmp/curl.err,为了使脚本正常运行,需要放一个mail.py脚本和本脚本在同一个目录下。

52、题目要求  :  小于5k文件打包

将用户家目录(考虑到执行脚本的用户可能是普通用户也可能是root)下面小于5KB的文件打包成tar.gz的压缩包,并以当前日期为文件名前缀,例如,2018-03-15.tar.gz。

【核心要点】

find ./ -type f  -size -5k                   #查找小于5k文件

date +%F                                #打包成当前日期为文件名前缀的压缩包

参考答案

#!/bin/bash
#这个脚本用来打包用户家目录下小于5k的文件
#作者:猿课-阿铭 www.apelearn.com
#日期:2018-11-01t=`date +%F`
cd $HOME
tar czf $t.tar.gz `find ./ -type f -size -5k|xargs`

实例 :

查找小于5k的文件

查找小于5k的文件,使用xargs命令,所有的文件只显示在一行。

当前用户的家目录

执行脚本,查看结果

查看压缩打包的内容

注意  :

t=`date +%F`                               #打印出当前系统时间

53、题目要求    监控22端口是否被封

一个同学不小心用iptables规则把sshd端口22给封掉了,结果不能远程登陆,要想解决这问题,还要去机房,登录真机去删除这规则。 问题来了,要写个监控脚本,监控iptables规则是否封掉了22端口,如果封掉了,给打开。 写好脚本,放到任务计划里,每分钟执行一次。

【核心要点】

1、如何判断是否封掉22端口是本题关键点

2、思路是查看iptables INPUT链规则,看是否有目标端口为22,的规则,并且规则target为DROP或者REJECT。有这两个,说明被封了。

参考答案

#!/bin/bash
#这个脚本用来解封22端口
#作者:猿课-阿铭 www.apelearn.com
#日期:2018-11-01iptables -nvL INPUT --line-numbers |grep -w 'dpt:22' |awk '$4 ~/REJECT|DROP/ {print $1}' > /tmp/iptables.log
n=`wc -l /tmp/iptables.log`if [ $n -gt 0 ]
thenfor n in `tac /tmp/iptables.log`doiptables -D INPUT $ndone
fi

实例 :

查看所有的iptbale链,删除规则2,命令 : “iptables -D INPUT 2”

给IPTABLES的22端口写两个规则,DROP,REJECT

iptables规则中过滤出,含有dpt:22的行

iptables规则中过滤出,含有dpt:22的行,找出第三行,含有REJECT或者DROP的行

使用line-number查找含有含有REJECT或者DROP的行

添加规则

只显示含有REJECT或者DROP的行,只打印出来行号

先删除第一个规则,然后查看只显示含有REJECT或者DROP的行,只打印出来行号。【注意: 删除的规则,应该从最底下的规则5,开始删除】

执行脚本,查看脚本运行的结果

注意  :

iptables -nvL INPUT --line-numbers |grep -w 'dpt:22' |awk '$4 ~/REJECT|DROP/ {print $1}' > /tmp/iptables.log                  #iptables规则中过滤出,含有dpt:22的行,找出第四行,含有REJECT或者DROP的行

$n -gt 0                          #$n大于了,开始解封

for n in `tac /tmp/iptables.log`                #倒叙解封,/tmp/iptables.log

54、题目要求   : 分析日志

已知nginx访问的日志文件在/usr/local/nginx/logs/access.log内,请统计下早上10点到12点 来访ip最多的是哪个?

参考日志

111.199.186.68 – [15/Sep/2017:09:58:37 +0800]  “//plugin.php?id=security:job” 200 “POST //plugin.php?id=security:job HTTP/1.1″”http://a.lishiming.net/forum.php?mod=viewthread&tid=11338&extra=page%3D1%26filter%3Dauthor%26orderby%3Ddateline” “Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3141.7 Safari/537.36”
203.208.60.208 – [15/Sep/2017:09:58:46 +0800] “/misc.php?mod=patch&action=ipnotice&_r=0.05560809863330207&inajax=1&ajaxtarget=ip_notice” 200 “GET /misc.php?mod=patch&action=ipnotice&_r=0.05560809863330207&inajax=1&ajaxtarget=ip_notice HTTP/1.1″”http://a.lishiming.net/forum.php?mod=forumdisplay&fid=65&filter=author&orderby=dateline” “Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3141.7 Safari/537.36”

【核心要点】

1、需要截取10点到12点之间的日志,思路是用grep过滤时间关键字。

2、请求的IP在日志中在第一段,用awk截取即可。

参考答案

#!/bin/bash
#这个脚本用来分析Nginx访问日志
#作者:猿课-阿铭 www.apelearn.com
#日期:2018-11-01export LANG=en
log="/usr/local/nginx/logs/access.log"
t=`date +%d/%b/%Y:1[01]:[0-5][0-9]:`egrep "$t" $log|awk '{print $1}' |sort -n |uniq -c |sort -n |tail -1 |awk '{print $2}'

实例 :

执行脚本,查看脚本运行的结果

注意  :

t=`date +%d/%b/%Y:1[01]:[0-5][0-9]:`                     #截取10,11点两个小时的日志,是时间59分59秒

egrep "$t" $log|awk '{print $1}' |sort -n |uniq -c |sort -n |tail -1 |awk '{print $2}'                                 #排序,统计行数,排序,截取第二行

55、题目要求    打印数字

写一个shell脚本。提示输入一个暂停的数字,然后从1打印到该数字。然后询问是否继续。继续的话再输入一个数字接着打印,否则退出脚本。

例:如果输入的是5,打印1 2 3 4 5,然后继续输入15,然后打印6 7 …14 15 以此类推。

【核心要点】

1、根据题目要求,首先用read -p 提示用户输入数字,获取到第一个数字。

2、此时需要判断用户输入的是纯数字。

3、第一次循环后,若用户继续输入数字,此时不仅要判断输入的是是否是纯数字,还要判断输入的数字是否比第一个数字大。

参考答案

#!/bin/bash
#这个脚本用来打印数字
#作者:猿课-阿铭 www.apelearn.com
#日期:2018-11-01read -p "Please input a number: " n
n1=`echo $n |sed 's/[0-9]//g'`
if [ -n "$n1" ]
thenecho "Please input a number."exit
fifor i in `seq 1 $n`
doecho $i
doneread -p "If continue? y/n" ccase $c inn|N)exit;;y|Y)read -p "Please input a number: " n2n3=`echo $n2|sed 's/[0-9]//g'`if [ -n "$n3" ]thenecho "Please input a number."exitfiif [ $n2 -le $n ]thenecho "$n2 should grater than $n."exitfifor i in `seq $[$n+1] $n2`doecho $idone;;*)echo "Please input y or n.";;
esac

实例 :

执行脚本,查看脚本运行的结果

注意  :

if [ -n "$n1" ]                          #第一次执行,如果$n1 不为空,提示"Please input a number.",然后退出脚本

n1=`echo $n |sed 's/[0-9]//g'`                   #清空所有的数字

n3=`echo $n2|sed 's/[0-9]//g'`                   #清空所有的数字

for i in `seq $[$n+1] $n2`                        #

for i in `seq 1 $n`                        #打印所有的数字,然后提示 “"If continue? y/n"”

if [ $n2 -le $n ]                                                    #$n2小于等于1,提示 "$n2 should grater than $n."

56、题目要求 :  打印数字

在文本文档1.txt第5行(假设文件行数大于5)后面增加如下内容:

# This is a test file.
# Test insert line into this file.

【核心要点】

1、给文档指定行后面增加内容,可以使用sed搞定

2、比较笨的方法是,依次按顺序打印前5行,然后打印要增加的行,再从文本第6行开始一直到结束依次打印剩余的行。

参考答案

#!/bin/bash
#这个脚本用来给文件增加行
#作者:猿课-阿铭 www.apelearn.com
#日期:2018-11-01n=0
cat 1.txt |while read line
don=$[$n+1]if [ $n -eq 5 ]thenecho $lineecho -e "# This is a test file.\n# Test insert line into this file."elseecho $linefi
done

实例 :

写一个文档1.txt,添加内容

在文档中,第5、6行添加内容

在文档中,第5行增加两行内容,使用\n

在文档中,第5行增加两行内容,

执行脚本,查看脚本运行的结果

注意  :

n=0                       #n是计数器

line                          #line  是变量

if [ $n -eq 5 ]                      #等于第五行

echo $line                                   #第一个echo $line,是打印第5行的意思

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
#这个脚本用来备份/etc/目录
#作者:猿课-阿铭 www.apelearn.com
#日期:2018-12-02d1=`date +%d`
d2=`date +%y%m%d`if [ $d1 == "01" ]
thencd /etc/tar czf /root/bak/$d2_etc.tar.gz ./
fi

实例 :

date +%d是否是01,大写的Y,表示显示4位数。

执行脚本,查看脚本运行的结果

注意  :

if [ $d1 == "01" ]                                    #如果是01,执行下面的指令

tar czf /root/bak/$d2_etc.tar.gz ./                 #打包到 /root/bak/$d2_etc.tar.gz,

58、题目要求  :  找出重复的单词

将文件内所有的单词的重复次数计算出来,只需要列出重复次数最多的10个单词。

【核心要点】

把非英文的字符删除掉(用空格替换),剩下的就是英文字母或者单词。

参考答案

#!/bin/bash
#这个脚本用来找出重复的单词
#作者:猿课-阿铭 www.apelearn.com
#日期:2018-12-02for w in `sed 's/[^a-zA-Z]/ /g' $1`
doecho $w
done |sort |uniq -c |sort -nr|head

实例 :

/etc/passwd文件在中将所有非英文字母,替换成空格、全局

/etc/passwd文件在中将所有非英文字母,替换成空格、全局,显示在一列。

查看前10列

执行脚本,查看脚本运行的结果

注意  :

done |sort |uniq -c |sort -nr|head                            #排序,统计行数,排序,查看前10列

59、题目要求   :  人员分组

需求是,把所有的成员平均分成若干个小组。这里,提供一个人员列表,比如成员有50人,需要分成7个小组,要求随机性,每次和每次分组的结果应该不一致。

【核心要点】

1、首先确定好要分的小组个数,本题中假设有50人,分7个小组,平均每个小组个数应为7。

2、为了实现随机性,我们可以根据人名的长度来做一个运算,比如用一个随机数+人名的长度得到一个随机数,然后除以7取余数,余数是几就把该用户分到第几组里。

3、考虑到人员数量较少,最终分组结果一定不均衡,比如,有的小组分了10个人,但有的小组却分到了3个人,这样严重不均衡。

4、为了让人员更加均衡,需要把人数偏多的组(大于7的)均分一部分成员到人数偏少的组(小于7的)。

参考人员名单

xiaoguisheng
guoyuqing
xiongyongzheng
mengjintang
chaizuzhou
zhousheng
xufangming
zhaoliangyun
hanshiru
wangxianyi
zhangjipei
luxiuli
yangshugen
guoyongzhi
lijianguo
wuqiongchen
dinglin
yaoyashan
yinzijia
wangbencheng
liuxiuwen
chenzuqi
leyuguo
baozongyao
fenghao
sunxiaoquan
zhangyaxian
lijiuzhe
dulichun
lixi
shenpeiwen
zousilin
luoping
chaiyan
fandaozhang
huzixiang
jinzhen
zhujunfeng
liqianbiao
hangyanliang
luorenjian
loujianji
fujianzhou
gengyiwu
jinjigui
liuzhizhong
lisanyan
lisili
zhangyiyu
songguozhen
zhangxinghua
zhaozhiyong
huanghe
xiaojie
fanhongfei
wangguiwen
renshumin
songfuying
zhanghaibo
liguangqun
puaihua
yanzhihua
gaojixian
liulai
funing
chenruizhi
chendaxin
laishaoying
xujian
xiaozhekou
xuxiaping
jiangchunqing

参考答案

【核心要点】

#!/bin/bash
#这个脚本用来给人员分组
#作者:猿课-阿铭 www.apelearn.com
#日期:2018-12-02#人员列表文件
f=member.txt
#小组数
group_n=7
#人员总数
member_n=`wc -l $f|awk '{print $1}'`#根据姓名计算该用户所在小组的id
get_n()
{#根据姓名计算cksum值l=`echo $1|cksum|awk '{print $1}'`#获取一个随机数n1=$RANDOM#cksum值和随机数相加,然后除以小组数取余,这样可以确保每次获取到的余数都不一样n2=$[$n1+$l]g_id=$[$n2%$group_n]#假如小组数为7,则余数范围0-6,如果余数为0,则小组为7if [ $g_id -eq 0 ]theng_id=$group_nfiecho $g_id
}for i in `seq 1 $group_n`
do#n_$i.txt为临时文件,用来记录该小组内的成员#脚本之前执行过,则该文件会存在,本次执行脚本前应该删除掉这个临时文件[ -f n_$i.txt ] && rm -f n_$i.txt
doneshuf $f|while read name
do#计算用户所在小组的idg=`get_n $name`#将人员追加写入到他对应的小组里echo $name >> n_$g.txt
done#定义计算文件行数的函数
nu(){wc -l $1|awk '{print $1}'
}#获取组员人数最多的小组
max(){ma=0for i in `seq 1 $group_n|shuf`don=`nu n_$i.txt`if [ $n -gt $ma ]thenma=$nfidoneecho $ma
}#获取组员人数最少的小组
min(){mi=$member_nfor i in `seq 1 $group_n|shuf`don=`nu n_$i.txt`if [ $n -lt $mi ]thenmi=$nfidoneecho $mi
}#定义四舍五入函数
div()
{n=`echo "scale=1;$1/$2"|bc`n1=`echo "scale=1;$n+0.5"|bc`echo $n1|cut -d. -f1
}#小组组员平均值(非四舍五入)
ava_n=$[$member_n/$group_n]
#小组组员平均值(四舍五入)
ava_n1=`div $member_n $group_n`if [ $ava_n -eq $ava_n1 ]
then#定义初始最小值ini_min=1#以下while循环要做的事情,就是要把人数多的组里的人搞到人数少的组里去#此while循环的条件是,当人数最少的组成员数小于组员平均值while [ $ini_min -lt $ava_n1 ]do#找出人数最多的组m1=`max`#找出人数最少的组m2=`min`for i in `seq 1 $group_n|shuf`don=`nu n_$i.txt`#找到人数最多的组对应的文件f1(可能有多个,这里取出现的第一个即可)if [ $n -eq $m1 ]thenf1=n_$i.txt#找到人数最少的组对应的文件f2(可能有多个,这里取出现的第一个即可)elif [ $n -eq $m2 ]thenf2=n_$i.txtfidone#取f1中最后一个人名name=`tail -n1 $f1`#将这个人名追加写入f2中echo $name >> $f2#在f1中删除刚刚取走的人名sed -i "/$name/d" $f1#把此时的最少组人员数赋值给ini_minini_min=`min`done
else#定义初始最大值ini_max=$member_nwhile [ $ini_max -gt $ava_n1 ]do#找出人数最多的组m1=`max`#找出人数最少的组m2=`min`for i in `seq 1 $group_n|shuf`don=`nu n_$i.txt`#找到人数最多的组对应的文件f1(可能有多个,这里取出现的第一个即可)if [ $n -eq $m1 ]thenf1=n_$i.txt#找到人数最少的组对应的文件f2(可能有多个,这里取出现的第一个即可)elif [ $n -eq $m2 ]thenf2=n_$i.txtfidone#取f1中最后一个人名name=`tail -n1 $f1`#将这个人名追加写入f2中echo $name >> $f2#在f1中删除刚刚取走的人名sed -i "/$name/d" $f1#把此时的最少组人员数赋值给ini_minini_max=`max`done
fifor i in `seq 1 $group_n`
doecho -e "\033[34m$i 组成员有:\033[0m"cat n_$i.txt#把临时文件删除rm -f n_$i.txtecho
done

实例 :

执行脚本,查看脚本运行的结果

注意  :

要bc命令,bc是一个计算器,需要使用:yum install -y bc

member_n=`wc -l $f|awk '{print $1}'`                               #统计人员总数和行数

shuf $f|while read name                                    #将小组人员,随机分配。

echo -e "\033[34m$i 组成员有:\033[0m"                                #

60、题目要求   :   比较两个数大小

写一个shell脚本,比较两个数的大小,支持浮点数,两个数通过shell参数的形式提供。

【核心要点】

参考答案

#!/bin/bash
#这个脚本用来比较两个数大小
#作者:猿课-阿铭 www.apelearn.com
#日期:2018-12-05if [ $# -ne 2 ]
thenecho "请提供两个参数."exit
fiif_number()
{if echo $1|grep -q '^-'thennu=`echo $1|sed 's/^-//'`elsenu=$1fin=`echo $nu|sed 's/[0-9.]//g'`if [ -n "$n" ]thenecho "$1不是合法数字."exitfiif echo $1|grep -q '^\.'thenecho "$1不是合法数字."exitfi
}if_number $1
if_number $2n1=`echo "$1>$2"|bc`
if [ $n1 -eq 1 ]
thenecho "$1 > $2"
elseif [ "$1" == "$2" ]thenecho "$1 = $2"elseecho "$1 < $2"fi
fi

实例 :

执行脚本,查看脚本运行的结果

注意  :

写一个脚本,add_title.sh,写入前缀,然后执行:sh add_title.sh 12.sh,将前缀写入12脚本中

执行结果

来源 :https://github.com/aminglinux/shell100/blob/master/13.md

转载于:https://my.oschina.net/u/3803405/blog/3001189

shell实例100例《六》相关推荐

  1. shell实例100例《七》

    2019独角兽企业重金招聘Python工程师标准>>> 61.题目要求  :  找文件差异 有两个文件a.txt中和b.txt,需求是,把A.TXT中有的但b.txt中没有的行找出来 ...

  2. shell实例100例《一》

    2019独角兽企业重金招聘Python工程师标准>>> 1.[题目要求]每日一文件 请按照这样的日期格式(xxxx-xx-xx)每日生成一个文件, 例如生成的文件名为2017-12- ...

  3. Linux脚本选题背景,shell实例100例《一》

    1.[题目要求]每日一文件 请按照这样的日期格式(xxxx-xx-xx)每日生成一个文件, 例如生成的文件名为2017-12-20.log, 并且把磁盘的使用情况写到到这个文件中, 不用考虑cron, ...

  4. linux脚本从100减到1,shell实例100例《十一》

    101.编写一个脚本,进行简单的减法运算,要求提示输入变量 #!/bin/bash read -p "input a number:" num1 read -p "inp ...

  5. matlab简单程序实例视频,matlab编程实例100例.docx

    matlab编程实例100例 1-32是:图形应用篇33-66是:界面设计篇67-84是:图形处理篇85-100是:数值分析篇实例1:三角函数曲线(1)function shili01h0=figur ...

  6. 转 shell编程100例

    shell编程100例 联系我 1.编写hello world脚本 #!/bin/bash # 编写hello world脚本 echo "Hello World!" 2.通过位置 ...

  7. shell脚本100 例(上) shell 脚本知识点,学习、进修、面试、居家旅行必备精品.--潜心研究必有所成

    [SHELL 脚本 100 例] 此内容为个人学习笔记,如有雷同,纯属巧合 编写 hello world 脚本 #!/bin/bash echo "hello world" 通过位 ...

  8. shell编程100例之输入三个数并进行升序排序

    shell编程100例之输入三个数并进行升序排序 #!/bin/bash# 依次提示用户输入 3 个整数,脚本根据数字大小依次排序输出 3 个数字 read -p "请输入一个整数:&quo ...

  9. python十大实例_Python练习实例100例(从简入难)96-100

    相信有很多人都在努力地自学着Python,但自学过程中总是看懂了却不会做.这就像学生时期老师讲过了,觉得听懂了,但一看题就懵了. 在自学任何一门软件或是编程语言的过程中,最重要的是结合教程去进行实践训 ...

最新文章

  1. Python,C++中点云 .las转.pcd
  2. 分析了10万起诈骗案例,大数据告诉你:2018年骗子更狡猾了
  3. __call__ 可调用对象
  4. linux内核多队列,Linux Kernel 中 Workqueue 使用系统默认队列和创建队列的方法
  5. 利用scrapy爬取文件后并基于管道化的持久化存储
  6. Java 算法 理财计划
  7. ORACLE 中NUMBER类型默认的精度和Scale问题
  8. JSP字符集编码集合
  9. Scratch二次开发——如何创建单独的Scratch作品展示页?
  10. 数据库备份的几种方式的详细步骤
  11. 计算机纸牌游戏攻略,Windows纸牌游戏怎么玩 玩法技巧攻略详解
  12. Sublime txt文本编辑器快捷方式简介
  13. 银盒子智慧餐厅硬件尺寸规格推荐机型
  14. 南京高中计算机老师,30个全省第一!南京老师又出名了!
  15. c语言s-next,memset_s - [ C语言中文开发手册 ] - 在线原生手册 - php中文网
  16. web3探索,从密码朋克开始的奇妙故事
  17. 怎么制作app系统软件,大概需要多少钱
  18. 生成带参数的微信二维码
  19. 仿淘宝上拉进入详情页交互的实现
  20. B站视频之CC字幕抓取

热门文章

  1. 帝国php数据库备份,解决帝国cms帝国数据库备份王php5.3下500错误
  2. 经验总结:java自学视频免费
  3. 检查计算机网络是否连通可运行什么命令,用ping命令如何检测目标主机是否能连通...
  4. 冒泡排序java jsp_冒泡排序实现原理
  5. linux nona怎么用_Linux nano编辑器命令常用方法
  6. ffmpeg添加到环境变量_在 Mac 上为 FFmpeg 配置环境变量
  7. html 下拉导航栏源码,html导航栏下拉菜单怎么制作?这里有详细的代码实例
  8. 全国计算机二级考试c语言指针,全国计算机等级考试二级C语言指针检测试题.doc...
  9. cmd命令java出错_Java基础知识_JavaSE_02
  10. gcc可以编译python程序吗_GCC编译C语言程序完整演示