shell 目录下文件名放入循环_分享7个shell脚本实例,值得收藏练习

概述

读书百遍其义自见,shell脚本也是,只要例子看得多了,自然就知道怎么写了。这里主要整理了20几个例子,因为内容比较多,所以分了几次来做介绍了。下面的实例最好先自己思考怎么去实现,然后再看下实现的方式,答案不是标准的,也存在一些可以继续完善的地方。


1、文件以日期命名,并写入磁盘使用情况

#!/bin/bash ##################################################文件以日期命名,并写入磁盘使用情况#################################################d=`date +%Y-%m-%d` ##获取日期logfile=$d.log ##定义日志文件名df -h > $logfile ##向文件写入磁盘使用情况
a549e2a5730342c89142adb1f348f571

2、统计日志文件中各个IP的访问量

1)、新建日志文件 ,文件名 1.txt

123 -sdfjukhesdjkfghjkldf 456 -jsdigkhndjfgjd 789 -dsfjkdhfjkhsdjkfhsjk 123 -sdfhfjkhsjklaj 789 -jfgduhdjkfghjkdf 123 -dhsfgjkhsdjkghjkdf

2)脚本2.sh

#!/bin/bash###################################################取文件IP|排序|去重并统计各个IP重复数量|排序#################################################awk '{print $1}' 1.txt |sort -n |uniq -c |sort -n
972162a0e69f42a39d5db40bc22a7a19

3.计算Linux系统所有进程占用内存之和

#!/bin/bash##################################################计算Linux系统所有进程占用内存之和#################################################sum=0#利用for循环调取每一项进程所使用的内存,并依次求和for mem in `ps aux |awk '{print $6}' |grep -v 'RSS'`do sum=$[$sum+$mem] ##内存求和doneecho "the usered mem $sum" ##输出结果
1617a0ea045149eaa738cf3d83cb0729

4.监控远程机器的存活,发现宕机示警

#!/bin/bash##################################################监控远程机器的存活,发现宕机示警##################################################假设远程机器IP为114.114.114.114ip=114.114.114.114d=`date +%Y-%m-%d` ##获取日期#while循环做循环监控,"while :"为死循环while :do#使用ping命令,取丢包率的数值作为存活的判断依据n=`ping -c2 $ip 2> /dev/null |grep 'received' |awk -F 'received, |%' '{print $2}'`n1=`echo $n |sed 's/[0-9]//g'`#判断取值是否为空 if [ -z "$n" ] then echo "error" exit#判断取值是否为数字 elif [ -n "$n1" ] then echo "error" exit#若丢包率不低于20%,则发送告警 elif [ $n -ge 20 ] then #这里也可做外发邮件告警 echo "more loss" else echo "$d : $ip is OK" > ip_monitor.log fi#监控间隔为30秒sleep 30done
9780877023b24432bc0af01890fdd628

5.批量修改指定目录下文件名、打包并还原文件名

#!/bin/bash##################################################批量修改指定目录下文件名、打包并还原文件名##################################################将目标文件夹下的所有指定类型文件的文件名查找存在指定文件中find /home/scripts -type f -name "*.txt" > /home/scripts/txt.list#通过for循环遍历所有文件,并依次改名for f in `cat /home/scripts/txt.list`do mv $f $f.bakdone#定义一个时间命名的目录作为打包文件的目录d=`date +%F`mkdir /home/scripts/txt_$d#将所有改名文件依次拷贝到打包文件的目录下for f in `cat /home/scripts/txt.list`do cp $f.bak /home/scripts/txt_$ddone#进入指定目录下进行打包cd /home/scriptstar -czvf txt.tar.gz txt_$d#还原文件名for f in `cat /home/scripts/txt.list`do mv $f.bak $fdone

注:虽然打包的文件多了一层文件名,但是对于还原文件名变得十分容易

a80a5a0e04a34d84ab5d3332a8bfc3bb
999fad4c1ec44a90abb44c5681c9a2d1

6.判断本机80端口是否监听,如果不存在,则重启服务并发送邮件告警

#!/bin/bash############################################################判断本机80端口是否监听,如果不存在,则重启服务并发送邮件告警############################################################判断本机80端口是否监听,并执行相应动作(使用命令行作为判断条件时,命令行正确执行即满足if条件,且用于判定的命令行不需要加反引号)if netstat -ntpl |grep -q ':80 ' then exit else #这里也可做外发邮件告警 echo "error" #service nginx restartfi#判断是否启动成功,如未成功,则将错误信息通过邮件进行告警n=`pgrep -l httpd |wc -l` #列出所有httpd进程的pidif [ $n -eq 0 ] then touch /tmp/nginx_start.err /usr/local/nginx/sbin/nginx start 2> /tmp/nginx_start.errfiif [ -s apache_start.err ] #if -s 选项,文件大小非0时为真 then #这里也可做外发邮件告警 echo "error"fi

注:持续监控可以采用任务计划或while循环

cc9c45d3e1e24152b0d247fb321a1f31

7.多地备份数据库(本地保留一周、远程保留一月)

#!/bin/bash############################################################多地备份数据库(本地保留一周、远程保留一月)#date +%Y # 年份(四位) eg: 2018#date +%y # 年份后两位 eg: 18#date +%m # 月 eg: 07#date +%d # 日 eg: 10#date +%H # 24小时 eg: 11#date +%M # 分 eg: 37#date +%S # 秒 eg: 24#date +%w # 星期(0-6) 0 表示周日#date +%F # 完整日期 =%Y-%m-%d #date +%T # =%H:%M:%S 时间 eg: 10:46:45###########################################################d1=date +%wd2=date +%y-%m-dbakdir='/backup'r_bakdir='远程备份的IP地址':'远程备份的目录' #通过ssh同步rs_bakdir='远程备份的IP地址'::'模块名称' #通过服务同步#定义接下来的命令涉及到的所有的正确输出记录在正确日志的目录下,所有的错误输出记录在错误日志的目录下exec 1> '正确日志的目录' 2>'错误日志的目录'echo "mysql backup begin at `date +"%F %T"`"#备份到本地机器的文件以星期命名,周期为7天,超出7天后,同名的旧文件会被新文件覆盖mysqldump -u'指定的用户' -p'指定的密码' '指定的数据库' > $bakdir/$d1.sql#备份到远程机器的文件以日期命名,周期为31天,超出31天后,同名的旧文件会被新文件覆盖rsync -az $bakdir/$d1.sql $r_bakdir/$d2.sqlecho "mysql backup end at `date +"%F %T"`"
cde5c16bfbd84d7197adca585f7f3bee

这些实际上是平时写shell脚本的一个一个片段,主要是记住实现的方式,逻辑通就可以了,下次就知道怎么写了。

后面会分享更多devops和DBA方面的内容,感兴趣的朋友可以关注下~

如果你觉得这篇文章对你有帮助, 请小小打赏下~

57345e482def45a285eb79fa5a97d095
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值