精简代码,责任链模式牛逼!!(上)【送源码】

1、检测两台服务器指定目录下的文件一致性

#!/bin/bash  ######################################  检测两台服务器指定目录下的文件一致性  #####################################  #通过对比两台服务器上文件的md5值,达到检测一致性的目的  dir=/data/web  b_ip=192.168.88.10  #将指定目录下的文件全部遍历出来并作为md5sum命令的参数,进而得到所有文件的md5值,并写入到指定文件中  find $dir -type f|xargs md5sum > /tmp/md5_a.txt  ssh $b_ip "find $dir -type f|xargs md5sum > /tmp/md5_b.txt"  scp $b_ip:/tmp/md5_b.txt /tmp  #将文件名作为遍历对象进行一一比对  for f in `awk '{print 2} /tmp/md5_a.txt'`do  #以a机器为标准,当b机器不存在遍历对象中的文件时直接输出不存在的结果  if grep -qw "$f" /tmp/md5_b.txt  then  md5_a=`grep -w "$f" /tmp/md5_a.txt|awk '{print 1}'`  md5_b=`grep -w "$f" /tmp/md5_b.txt|awk '{print 1}'`  #当文件存在时,如果md5值不一致则输出文件改变的结果  if [ $md5_a != $md5_b ]then  echo "$f changed."  fi  else  echo "$f deleted."  fi  done  

2、定时清空文件内容,定时记录文件大小

#!/bin/bash  #################################################################  每小时执行一次脚本(任务计划),当时间为0点或12点时,将目标目录下的所有文件内#容清空,但不删除文件,其他时间则只统计各个文件的大小,一个文件一行,输出到以时#间和日期命名的文件中,需要考虑目标目录下二级、三级等子目录的文件  ################################################################  logfile=/tmp/`date +%H-%F`.log  n=`date +%H`  if [ $n -eq 00 ] || [ $n -eq 12 ]  then  #通过for循环,以find命令作为遍历条件,将目标目录下的所有文件进行遍历并做相应操作  for i in `find /data/log/ -type f`  do  true > $i  done  else  for i in `find /data/log/ -type f`  do  du -sh $i >> $logfile  done  fi  

3、检测网卡流量,并按规定格式记录在日志中

#!/bin/bash  #######################################################  #检测网卡流量,并按规定格式记录在日志中#规定一分钟记录一次  #日志格式如下所示:  #2019-08-12 20:40  #ens33 input: 1234bps  #ens33 output: 1235bps  ######################################################3  while :  do  #设置语言为英文,保障输出结果是英文,否则会出现bug  LANG=en  logfile=/tmp/`date +%d`.log  #将下面执行的命令结果输出重定向到logfile日志中  exec >> $logfile  date +"%F %H:%M"  #sar命令统计的流量单位为kb/s,日志格式为bps,因此要*1000*8  sar -n DEV 1 59|grep Average|grep ens33|awk '{print $2,"\t","input:","\t",$5*1000*8,"bps","\n",$2,"\t","output:","\t",$6*1000*8,"bps"}'  echo "####################"  #因为执行sar命令需要59秒,因此不需要sleep  done

4、计算文档每行出现的数字个数,并计算整个文档的数字总数

#!/bin/bash  #########################################################  #计算文档每行出现的数字个数,并计算整个文档的数字总数  ########################################################  #使用awk只输出文档行数(截取第一段)  n=`wc -l a.txt|awk '{print $1}'`  sum=0  #文档中每一行可能存在空格,因此不能直接用文档内容进行遍历  for i in `seq 1 $n`do  #输出的行用变量表示时,需要用双引号  line=`sed -n "$i"p a.txt`#wc -L选项,统计最长行的长度  n_n=`echo $line|sed s'/[^0-9]//'g|wc -L`  echo $n_nsum=$[$sum+$n_n]  done  echo "sum:$sum"

杀死所有脚本

#!/bin/bash  ################################################################  #有一些脚本加入到了cron之中,存在脚本尚未运行完毕又有新任务需要执行的情况,  #导致系统负载升高,因此可通过编写脚本,筛选出影响负载的进程一次性全部杀死。  ################################################################  ps aux|grep 指定进程名|grep -v grep|awk '{print $2}'|xargs kill -9

5、从 FTP 服务器下载文件​​​​​​​

#!/bin/bash  if [ $# -ne 1 ]; then      echo "Usage: $0 filename"  fi  dir=$(dirname $1)  file=$(basename $1)  ftp -n -v << EOF   # -n 自动登录  open 192.168.1.10  # ftp服务器  user admin password  binary   # 设置ftp传输模式为二进制,避免MD5值不同或.tar.gz压缩包格式错误  cd $dir  get "$file"  EOF

6、连续输入5个100以内的数字,统计和、最小和最大​​​​​​​

#!/bin/bash  COUNT=1  SUM=0  MIN=0  MAX=100  while [ $COUNT -le 5 ]; do      read -p "请输入1-10个整数:" INT          if [[ ! $INT =~ ^[0-9]+$ ]]; then          echo "输入必须是整数!"          exit 1      elif [[ $INT -gt 100 ]]; then          echo "输入必须是100以内!"          exit 1      fi      SUM=$(($SUM+$INT))      [ $MIN -lt $INT ] && MIN=$INT      [ $MAX -gt $INT ] && MAX=$INT      let COUNT++      done  echo "SUM: $SUM"  echo "MIN: $MIN"  echo "MAX: $MAX

用户猜数字​​​​​​​

#!/bin/bash  # 脚本生成一个 100 以内的随机数,提示用户猜数字,根据用户的输入,提示用户猜对了,  # 猜小了或猜大了,直至用户猜对脚本结束。  # RANDOM 为系统自带的系统变量,值为 0‐32767的随机数  # 使用取余算法将随机数变为 1‐100 的随机数num=$[RANDOM%100+1]echo "$num"   # 使用 read 提示用户猜数字  # 使用 if 判断用户猜数字的大小关系:‐eq(等于),‐ne(不等于),‐gt(大于),‐ge(大于等于),  # ‐lt(小于),‐le(小于等于)    while :    do           read -p "计算机生成了一个 1‐100 的随机数,你猜: " cai          if [ $cai -eq $num ]          then                  echo "恭喜,猜对了"                     exit              elif [ $cai -gt $num ]             then                      echo "Oops,猜大了"               else                      echo "Oops,猜小了"           fi    done  

7、监测 Nginx 访问日志 502 情况,并做相应动作

假设服务器环境为 lnmp,近期访问经常出现 502 现象,且 502 错误在重启 php-fpm 服务后消失,因此需要编写监控脚本,一旦出现 502,则自动重启 php-fpm 服务。​​​​​​​

#场景:  #1.访问日志文件的路径:/data/log/access.log  #2.脚本死循环,每10秒检测一次,10秒的日志条数为300条,出现502的比例不低于10%(30条)则需要重启php-fpm服务  #3.重启命令为:/etc/init.d/php-fpm restart  #!/bin/bash  ###########################################################  #监测Nginx访问日志502情况,并做相应动作  ###########################################################  log=/data/log/access.log  N=30 #设定阈值  while :do   #查看访问日志的最新300条,并统计502的次数      err=`tail -n 300 $log |grep -c '502" '`   if [ $err -ge $N ]   then  /etc/init.d/php-fpm restart 2> /dev/null   #设定60s延迟防止脚本bug导致无限重启php-fpm服务       sleep 60   fi   sleep 10   done  

8、将结果分别赋值给变量

应用场景:希望将执行结果或者位置参数赋值给变量,以便后续使用。

方法1:​​​​​​​

for i in $(echo "4 5 6"); do     eval a$i=$idone  echo $a4 $a5 $a6  

方法2:将位置参数192.168.1.1{1,2}拆分为到每个变量​​​​​​​

num=0  for i in $(eval echo $*);do   #eval将{1,2}分解为1 2     let num+=1     eval node${num}="$i"  done  echo $node1 $node2 $node3  # bash a.sh 192.168.1.1{1,2}  192.168.1.11 192.168.1.12    方法3:arr=(4 5 6)  INDEX1=$(echo ${arr[0]})  INDEX2=$(echo ${arr[1]})  INDEX3=$(echo ${arr[2]}) 

9、批量修改文件名

示例:​​​​​​​

# touch article_{1..3}.html  # lsarticle_1.html  article_2.html  article_3.html

把article改为bbs

方法1:​​​​​​​

for file in $(ls *html); do      mv $file bbs_${file#*_}      # mv $file $(echo $file |sed -r 's/.*(_.*)/bbs\1/')      # mv $file $(echo $file |echo bbs_$(cut -d_ -f2) 

方法2:​​​​​​​

for file in $(find . -maxdepth 1 -name "*html"); do       mv $file bbs_${file#*_}done  

方法3:

# rename article bbs *.html

把一个文档前五行中包含字母的行删掉,同时删除6到10行包含的所有字母

1)准备测试文件,文件名为2.txt​​​​​​​

第1行1234567不包含字母  第2行56789BBBBBB  第3行67890CCCCCCCC  第4行78asdfDDDDDDDDD  第5行123456EEEEEEEE  第6行1234567ASDF  第7行56789ASDF  第8行67890ASDF  第9行78asdfADSF  第10行123456AAAA  第11行67890ASDF  第12行78asdfADSF  第13行123456AAAA  

2)脚本如下:

#!/bin/bash  ###############################################################  把一个文档前五行中包含字母的行删掉,同时删除6到10行包含的所有字母  ##############################################################  sed -n '1,5'p 2.txt |sed '/[a-zA-Z]/'d  sed -n '6,10'p 2.txt |sed s'/[a-zA-Z]//'g  sed -n '11,$'p 2.txt  #最终结果只是在屏幕上打印结果,如果想直接更改文件,可将输出结果写入临时文件中,再替换2.txt或者使用-i选项 

 ——EOF——

福利:

扫码回复【酒店】可免费领取酒店管理系统源码

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值