Shell脚本编程学习笔记(十一)---- 习题集

219 阅读2分钟

本文已参与[新人创作礼]活动,一起开启掘金创作之路。

习题集收藏的是一些习题联系,可以自己尝试着做做!

习题1

将每天的磁盘使用状态写入相对应的按时间生成的日志文件里

#!/usr/bin/bash
Time=$(date +%F)       #时间
df -h > $Time.log      #磁盘使用成日志文件

习题2

统计Nginx日志中每个IP的访问量有多少

筛选ip;排序,去重,统计;

cat  /var/log/nginx/access.log

如无信息,可尝试下面这条命令,创造访问量

虚拟机上: ab -n2000 -c 200 http://127.0.0.1/index.html
本机上: ab -n2000 -c 200 http://IP地址/index.html

格式如下图

日志格式.png

awk '{print $1}'  /var/log/nginx/access.log|sort|uniq -c|head
#分割 排序 去重 统计 头部前10(不推荐)
awk '{print $1}'  /var/log/nginx/access.log|sort|uniq -c|sort -n|tail        
#升序排列
awk '{print $1}'  /var/log/nginx/access.log|sort|uniq -c|sort -rn|head   
#将访问量高的放在最上面

习题3

计算Linux系统所有进程占用内容大小的和

#!/usr/bin/bash
Men=$(ps aux|awk '{print $6}'|grep -v "RSS")   #列出所有进程占用内容大小
num=0
for i in $Men
do
      num=$[$i+$num]
done  
      num=$[$num/1024]
      echo ${num}M

习题4

找到/home目录下所有后缀名为.txt的文件,将其后缀名批量修改为txt.bak;将所有.bak文件打包压缩为123.tar.gz;批量还原文件的名字,及把增加的.bak再删除。

#!/usr/bin/bash
#1.将后缀名批量修改为txt.bak
file_txt=$(find /home/ type f -iname "*.txt"|xargs >/home/txt.tt)
for i in $(cat /home/txt.tt)
do 
      mv  $i $i.bak
done
#2.将所有.bak文件打包压缩为123.tar.gz
file_bak=$(find /home/ type f -iname "*.bak"|xargs >/home/tar.tt)
cd /home/
tar czf 123.tar.gz ./*.bak
#3.批量还原文件的名字,及把增加的.bak再删除
for j in $(cat /home/tar.tt)
do       
           mv $j ${j%.*}   #去掉.bak
done

习题5

检查80端口是否开启,如无就开启;再检查nginx是否开启,如无就开启。

#!/usr/bin/bash
#Port=$(netstat -lntp|grep ":80"|wc -l)             #检查80端口
Process=$(ps aux|grep [n]ginx|wc -l )               #查看有无nginx进程
yum install -y nmap
Port_open=$(nmap -p80 127.0.0.1|grep open|wc -l)    #检查80端口是否处于开启状态if [ $Port_open -ne 1 ];then
      if [ $Process -ne 2 ];then  
          /usr/sbin/nginx                #启动nginx
      else 
          /usr/sbin/nginx -s reload      #重新加载nginx
      fi
fi

习题6

有个lnmp环境,经常502,一旦重启php-fpm就解决,如果不重启就会持序;现在需要编写脚本,监控访问日志的状态码,一旦发生502,就自动重启php-fpm。

分析:1.通过日志尾部300行,统计502出现次数

2.精准判断是否是502,如果是就重启;不是就不管

#!/usr/bin/bash
while true
do
      sleep 3                        #停止3s等待服务器反应
      log=$(tail -n300 /var/log/nginx/access.log|grep "502"|wc -l)  #查询日志文件的后300行中的502个数
      if [ $log -ge 50 ];then        #超过50就重启
          systemctl restart php-fpm
          sleep 5                    #停止5s等待服务器反应
      fi
done

习题7

列出常用的命令top10

拿值,排序,去重,统计(3选其1)

history |awk '{print $2}'|sort|uniq -c|sort -rn|head
hash|sort -rn|head                         #缓存的命令
cat ~/.bash_history |sort|uniq -c|sort -rn|head

习题8

判断Linux服务器里是否开启web服务,如果开启,那开起的是哪种服务?

分析:筛选80端口是否存在,筛选80端口对应的服务是啥?

查看所有端口服务:netstat -lntp

#!/usr/bin/bash
Nginx_status=$(ss -lntup|grep ":80"|grep nginx|wc -l)
Http_status=$(ss -lntup|grep  ":80"|grep httpd|wc -l)
if [[ $Nginx_status -eq 0 && $Httpd_status -eq 0 ]];then
    echo "没有启动80端口"
    exit 1
fi
if [ $Nginx_status -eq 1 ];then
    echo "启动的是Nginx服务"
elif [ $Httpd_status -eq 1 ];then
    echo "启动的是Httpd服务"
else
    echo "启动的是未知服务"
        exit 2
fi

25.jpg

感谢大家,点赞,收藏,关注,评论!