当前位置: 首页 > news >正文

shell脚本案例分享 - 业务系统日志自定义保留或删除需求

 

需求说明:  线上某些业务系统的日志不定期产生, 有的每天产生, 有的好几天才产生, 因为系统只有在用的时候才产生日志,日志文件均存放在以当天日期命名的目录下. 当日志目录越来越多时就需要处理, 由此开发同事提出来一个需求, 需要一个自定义删除或保留这些日志目录的脚本, 如下:

[root@localhost pay-sign-oper]# ls
2018-09-13  2018-09-20  2018-10-11  2018-10-28  2018-11-02  2018-11-14  2018-12-04  2018-12-09          
2018-09-14  2018-09-27  2018-10-24  2018-10-29  2018-11-06  2018-11-15  2018-12-05  2018-12-10
2018-09-15  2018-09-29  2018-10-25  2018-10-30  2018-11-07  2018-11-30  2018-12-06  2018-12-11
2018-09-17  2018-09-30  2018-10-26  2018-10-31  2018-11-08  2018-12-02  2018-12-07  2018-12-12
2018-09-19  2018-10-08  2018-10-27  2018-11-01  2018-11-09  2018-12-03  2018-12-08  pay-sign-oper.log

[root@localhost pay-sign-oper]# ls 2018-09-13/
pay-sign-oper.2018-09-13.log

[root@localhost pay-sign-oper]# ls 2018-12-12/
pay-sign-oper.2018-12-12.log

比如现在开发同事想要删除2018年11月08号之前的日志, 现在就需要一个智能脚本, 用来一键实现这个需求.

脚本内容如下:

[root@localhost pay-sign-oper]# cat date_log_delete.sh 
#!/bin/bash

echo -n "请输入日期, 截止到该日期之前的日志目录接下来将要被删除:"  
read  date1

date2=$(echo ${date1}|awk -F"-" '{print $1$2$3}')

cd `pwd`
for date3 in $(ls -l|grep "drwxr"|awk '{print $9}'|awk -F"-" '{print $1$2$3}')
do
   a=$(echo ${date3}|cut -c 1-4)
   b=$(echo ${date3}|cut -c 5-6)
   c=$(echo ${date3}|cut -c 7-8)
   date4=$(echo ${a}-${b}-${c})

     if [ ${date3} -lt ${date2} ];then
        rm -rf ${date4} && echo "deleted ${date4}"
     else
        echo "${date4} do not need to delete"
     fi
done

授予脚本执行权限
[root@localhost pay-sign-oper]# chmod 755 date_log_delete.sh
[root@localhost pay-sign-oper]# ll date_log_delete.sh
-rwxr-xr-x 1 root root 557 Dec 13 14:50 date_log_delete.sh

比如现在想要删除2018年9月27号之前的日志, 则脚本执行后, 按照提示输入:2018-09-27 即可实现:

[root@localhost pay-sign-oper]# sh date_log_delete.sh 
请输入日期, 截止到该日期之前的日志目录接下来将要被删除:2018-09-27
deleted 2018-09-13
deleted 2018-09-14
deleted 2018-09-15
deleted 2018-09-17
deleted 2018-09-19
deleted 2018-09-20
2018-09-27 do not need to delete
2018-09-29 do not need to delete
2018-09-30 do not need to delete
2018-10-08 do not need to delete
2018-10-11 do not need to delete
2018-10-24 do not need to delete
2018-10-25 do not need to delete
2018-10-26 do not need to delete
2018-10-27 do not need to delete
2018-10-28 do not need to delete
2018-10-29 do not need to delete
2018-10-30 do not need to delete
2018-10-31 do not need to delete
2018-11-01 do not need to delete
2018-11-02 do not need to delete
2018-11-06 do not need to delete
2018-11-07 do not need to delete
2018-11-08 do not need to delete
2018-11-09 do not need to delete
2018-11-14 do not need to delete
2018-11-15 do not need to delete
2018-11-30 do not need to delete
2018-12-02 do not need to delete
2018-12-03 do not need to delete
2018-12-04 do not need to delete
2018-12-05 do not need to delete
2018-12-06 do not need to delete
2018-12-07 do not need to delete
2018-12-08 do not need to delete
2018-12-09 do not need to delete
2018-12-10 do not need to delete
2018-12-11 do not need to delete
2018-12-12 do not need to delete

脚本执行看, 查看, 发现2018年9月27号之前的日志和日志目录都被删除了.
[root@localhost pay-sign-oper]# ls
2018-09-27  2018-10-11  2018-10-27  2018-10-31  2018-11-07  2018-11-15  2018-12-04  2018-12-08  2018-12-12
2018-09-29  2018-10-24  2018-10-28  2018-11-01  2018-11-08  2018-11-30  2018-12-05  2018-12-09  date_log_delete.sh
2018-09-30  2018-10-25  2018-10-29  2018-11-02  2018-11-09  2018-12-02  2018-12-06  2018-12-10  pay-sign-oper.log
2018-10-08  2018-10-26  2018-10-30  2018-11-06  2018-11-14  2018-12-03  2018-12-07  2018-12-11

以上脚本看起来非常好用, 非常智能! 此脚本可以在任何这样的日志场景下使用. 下面针对脚本中涉及到的一些shell小脚本进行拆分说明:

1)
echo -n "请输入日期, 截止到该日期之前的日志目录接下来将要被删除:" 
read  date1
 
上面两行脚本内容用到了shell脚本中的read参数.
read参数表示接收标准输入(键盘)的输入,或其他文件描述符的输入。
得到输入内容后,read参数将该内容传递到一个标准变量中。
也就是脚本执行后提示输入的日期, 并将该日期传给${date1}变量
 
2)
date2=$(echo ${date1}|awk -F"-" '{print $1$2$3}')
 
这一行脚本内容是将输入的日期的格式转变成数字格式, 并传给变量${date2}, 是为了和后面的变量${date3}做if语句中的大小判断之用.
比如: 脚本执行后提示输入的内容是2018-09-27, 这个也就是变量${date1}的数值. 则变量${date}的值就是20180927.
[root@localhost pay-sign-oper]# echo 2018-09-27|awk -F"-" '{print $1$2$3}'
20180927
 
3)
cd `pwd`
 
这一行脚本内容表示切换到当前目录路径下 (其实可以不写这一行, 因为脚本文件就在当前目录下)
 
4)
for date3 in $(ls -l|grep "drwxr"|awk '{print $9}'|awk -F"-" '{print $1$2$3}')
 
这一行脚本内容表示在当前目录下取日期目录, 并将该日期目录的格式转变成数字形式, 并传给变量${date3}, 是为了和${date2}做if语句中的大小判断之用. 如下:
[root@localhost pay-sign-oper]# ls -l
total 136
drwxr-xr-x 2 root root 4096 Dec 13 14:56 2018-09-27
drwxr-xr-x 2 root root 4096 Dec 13 14:56 2018-09-29
drwxr-xr-x 2 root root 4096 Dec 13 14:55 2018-09-30
drwxr-xr-x 2 root root 4096 Dec 13 14:55 2018-10-08
...........
...........
drwxr-xr-x 2 root root 4096 Dec 13 12:40 2018-12-10
drwxr-xr-x 2 root root 4096 Dec 13 12:40 2018-12-11
drwxr-xr-x 2 root root 4096 Dec 13 12:40 2018-12-12
-rwxr-xr-x 1 root root  557 Dec 13 14:50 date_log_delete.sh
-rw-r--r-- 1 root root    0 Dec 13 12:40 pay-sign-oper.log


[root@localhost pay-sign-oper]# ls -l|grep "drwxr"|awk '{print $9}'
2018-09-27
2018-09-29
2018-09-30
2018-10-08
...........
...........
2018-12-10
2018-12-11
2018-12-12

[root@localhost pay-sign-oper]# ls -l|grep "drwxr"|awk '{print $9}'|awk -F"-" '{print $1$2$3}'
20180927
20180929
20180930
20181008
...........
...........
20181210
20181211
20181212
 
5)
a=$(echo ${date3}|cut -c 1-4)
b=$(echo ${date3}|cut -c 5-6)
c=$(echo ${date3}|cut -c 7-8)
 
这三行脚本内容表示提取一个数字字符串中的某几位. a , b, c 三个变量分别表示取变量${date3}数字中的第1-4位, 第5-6位, 第7-8位.
比如变量${date3}的数值是20180927, 则:
[root@localhost pay-sign-oper]# echo 20180927|cut -c 1-4
2018
[root@localhost pay-sign-oper]# echo 20180927|cut -c 5-6
09
[root@localhost pay-sign-oper]# echo 20180927|cut -c 7-8
27
 
6) date4=$(echo ${a}-${b}-${c})
 
这一行脚本内容表示将变量${date3}的数值拆分后再组成日期格式. 为了后面做if语句中的判断结果后的日期目录删除操作.
 
7)
if [ ${date3} -lt ${date2} ];then
        rm -rf ${date4} && echo "deleted ${date4}"
     else
        echo "${date4} do not need to delete"
     fi
 
上面的脚本内容表示if语句中判断,:
当变量${date3}数值小于变量${date2}的数值时, 就删除变量${date4}的日期目录,并打印删除信息.
当变量${date3}数值大于等于变量${date2}的数值时, 就打印不要删除的信息.

相关文章:

  • 比特币代码分析10 比特币中的工作量
  • Python正则表达式里的单行re.S和多行re.M模式
  • DOM: EVENT FLOW
  • 在windows10上利用Anaconda 搭建python3.6 + tensorflow环境
  • 修复win10无法双击打开txt文档.reg
  • JS的运行机制的总结!
  • 从SQL Server CloudDBA 看云数据库智能化
  • 夯实爪哇基础-数据类型,内存
  • Hibernate关联关系注解配置简单理解
  • 五大好用的开源MySQL管理工具推荐
  • day--42 前端基础小结
  • 【python】【基础】mac安装python3及pip
  • Using system view: sys.sysprocesses to check SqlServer's block and deadlock
  • JavaScript中for in 和for of的区别
  • 对于你们驳来驳去的《停止学习框架》,我有话说!
  • IE9 : DOM Exception: INVALID_CHARACTER_ERR (5)
  • 4. 路由到控制器 - Laravel从零开始教程
  • Android交互
  • Angular 4.x 动态创建组件
  • CentOS学习笔记 - 12. Nginx搭建Centos7.5远程repo
  • Docker 笔记(2):Dockerfile
  • ES6--对象的扩展
  • Gradle 5.0 正式版发布
  • iOS高仿微信项目、阴影圆角渐变色效果、卡片动画、波浪动画、路由框架等源码...
  • Linux Process Manage
  • nodejs实现webservice问题总结
  • supervisor 永不挂掉的进程 安装以及使用
  • webpack+react项目初体验——记录我的webpack环境配置
  • windows下如何用phpstorm同步测试服务器
  • 看完九篇字体系列的文章,你还觉得我是在说字体?
  • 前端面试之闭包
  • 入门级的git使用指北
  • 线上 python http server profile 实践
  • 想晋级高级工程师只知道表面是不够的!Git内部原理介绍
  • 用Node EJS写一个爬虫脚本每天定时给心爱的她发一封暖心邮件
  • raise 与 raise ... from 的区别
  • ​LeetCode解法汇总1276. 不浪费原料的汉堡制作方案
  • ​草莓熊python turtle绘图代码(玫瑰花版)附源代码
  • #{}和${}的区别是什么 -- java面试
  • #define,static,const,三种常量的区别
  • (1)(1.8) MSP(MultiWii 串行协议)(4.1 版)
  • (a /b)*c的值
  • (day 2)JavaScript学习笔记(基础之变量、常量和注释)
  • (MIT博士)林达华老师-概率模型与计算机视觉”
  • (分布式缓存)Redis持久化
  • (附源码)ssm教材管理系统 毕业设计 011229
  • (顺序)容器的好伴侣 --- 容器适配器
  • (转)微软牛津计划介绍——屌爆了的自然数据处理解决方案(人脸/语音识别,计算机视觉与语言理解)...
  • (转载)OpenStack Hacker养成指南
  • *上位机的定义
  • .NetCore 如何动态路由
  • .NET委托:一个关于C#的睡前故事
  • .NET中两种OCR方式对比
  • @Responsebody与@RequestBody
  • [AIGC] Spring Interceptor 拦截器详解