shell脚本案例1-5

案例1

题目要求

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

代码

#!/bin/bash
d=`date +%F` #显示当前时间以年-月-日形式
dir=/data/logs/disklog  #路径
if [ ! -d $dir ]  #如果不存在这个路径
then
    mkdir -p $dir #创建这个路径
fi
df -h > $dir/$d.log #将df -h 下的信息,存放再路径下,并且命名日期.log
find $dir/ -mtime +365 |xargs rm

实现解析
if语句批判是否创建目录,将df -h的信息存放再目录下

执行结果
在这里插入图片描述

案例2

题目要求
有日志1.log,部分内容如下

112.111.12.248 – [25/Sep/2013:16:08:31 +0800]formula-x.haotui.com “/seccode.php?update=0.5593110133088248″ 200″http://formula-x.haotui.com/registerbbs.php” “Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1;)”
61.147.76.51 – [25/Sep/2013:16:08:31 +0800]xyzdiy.5d6d.com “/attachment.php?aid=4554&k=9ce51e2c376bc861603c7689d97c04a1&t=1334564048&fid=9&sid=zgohwYoLZq2qPW233ZIRsJiUeu22XqE8f49jY9mouRSoE71″ 301″http://xyzdiy.5d6d.com/thread-1435-1-23.html” “Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)”

统计出每个IP访问量有多少
核心要点
awk、sort、uniq命令

参考答案
#!/bin/bash
awk '{print $1}' 1.log|sort |uniq -c |sort -n -r

需求
统计出每个IP访问量有多少
分析
awk是用来提取列的主要工具;
{print $1}就是将某一行(一条记录)中以空格为分割符的第一个字段打印出来
Sort排序,从大到小 sort -rn,unip -c 取出现次数总和
实现
awk ‘{print $1}’ 1.log|sort |uniq -c |sort -nr
实现解析
1.awk 提取列,第一行。
2.sort排序,unip出现次数,sort默认从小到大,sort -nr 从大到小
执行结果

在这里插入图片描述

案例3

** 题目要求**

设计一个shell脚本来备份数据库,首先在本地服务器上保存一份数据,然后再远程拷贝一份,本地保存一周的数据,远程保存一个月。

假定,我们知道mysql root账号的密码,要备份的库为discuz,本地备份目录为/bak/mysql, 远程服务器ip为192.168.123.30,
远程提供了一个rsync服务,备份的地址是 192.168.123.30::backup . 写完脚本后,需要加入到cron中,每天凌晨3点执行。

核心要点
  • 备份数据库的命令
  • 同步到远程去的命令
  • 本地一周,可以用date +%w做为后缀,远程一个月可以用date +%d做为后缀

代码

#!/bin/bash
d1=`date +%w`
d2=`date +%d`
local_bakdir=/bak/mysql
remote_bakdir=192.168.123.30::backup

exec 1> /tmp/mysqlbak.log  2>/tmp/mysqlbak.err
#1代表执行成功,2代表失败 执行成功,将结果存到指定日志
#执行出错,将结果存到指定的日志
echo "mysql bakcup begin at `date`"
mysqldump -uroot -pxxxx discz > $local_bakdir/discuz.sql.$d1
rsync -az $local_bakdir/discuz.sql.$d1 $remote_bakdir/discuz.sql.$d2
echo "mysql backup end at `date`"

需求

设计一个shell脚本来备份数据库,首先在本地服务器上保存一份数据,然后再远程拷贝一份,本地保存一周的数据,远程保存一个月。

分析

  • 备份数据库的命令
  • 同步到远程去的命令
  • 本地一周,可以用date +%w做为后缀,远程一个月可以用date +%d做为后缀

实现解析

mysqldump 备份数据库,然后raync远程复制(需要两台主机都安装rsync) -a参数表示存档模式,保存所有的元数据 -z参数指定同步时压缩数据。

执行结果
在这里插入图片描述

案例4

题目要求

设计一个脚本,监控远程的一台机器(假设ip为180.163.26.39)的存活状态,当发现宕机时发一封邮件给你自己。

核心要点

ping -c5 180.163.26.39 通过ping来判定对方是否在线
-c5 意思ping5次

发邮件脚本 mail.py
代码

#!/bin/bash
m=1122@qq.com #收邮件
while :
 do
n=`ping -c5 10.30.58.59|grep 'packet' |awk -F '%' '{print $1}' |awk '{print $NF}'`
if [ $n -eq 0 ]
then
echo "该主机在线" > /tmp/four2.sh1.log
else
echo "该主机不在线" >/tmp/four2.sh2.log
  python3 mail.py $m "机器宕机" "丢包率$n"
fi
 sleep 30
done

执行结果
在这里插入图片描述

案例5

题目要求

找到/123目录下所有后缀名为.txt的文件

  1. 批量修改.txt为.txt.bak
  2. 把所有.bak文件打包压缩为123.tar.gz
  3. 批量还原文件的名字,即把增加的.bak再删除
核心要点
  • find用来查找所有.txt文件
  • tar打包一堆文件
  • 还原文件名用for循环
    代码
#!/bin/bash
find /123/ -type f -name "*.txt" > /tmp/txt.list 
for f in `cat /tmp/txt.list`
do
    mv $f  $f.bak
done
#find /123/ -type f -name *.txt |xargs -i mv {} {}.bak 
#find /123/ -type f -name *.txt -exec mv {} {}.bak \;
for f in `cat /tmp/txt.list`
do
    echo $f.bak
done > /tmp/txt.bak.list 
tar -czvf 123.tar.gz `cat /tmp/txt.bak.list |xargs `
for f in `cat /tmp/txt.list`
do 
    mv $f.bak $f
done 

需求

1. 批量修改.txt为.txt.bak
2. 把所有.bak文件打包压缩为123.tar.gz
3. 批量还原文件的名字,即把增加的.bak再删除

分析

  • find用来查找所有.txt文件
  • tar打包一堆文件
  • 还原文件名用for循环

执行结果
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值