案例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的文件
- 批量修改.txt为.txt.bak
- 把所有.bak文件打包压缩为123.tar.gz
- 批量还原文件的名字,即把增加的.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循环
执行结果