博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
shell脚本案例分享 - 业务系统日志自定义保留或删除需求
阅读量:6186 次
发布时间:2019-06-21

本文共 5759 字,大约阅读时间需要 19 分钟。

 

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

[root@localhost pay-sign-oper]# ls2018-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-102018-09-15  2018-09-29  2018-10-25  2018-10-30  2018-11-07  2018-11-30  2018-12-06  2018-12-112018-09-17  2018-09-30  2018-10-26  2018-10-31  2018-11-08  2018-12-02  2018-12-07  2018-12-122018-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/bashecho -n "请输入日期, 截止到该日期之前的日志目录接下来将要被删除:"  read  date1date2=$(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"     fidone授予脚本执行权限[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-27deleted 2018-09-13deleted 2018-09-14deleted 2018-09-15deleted 2018-09-17deleted 2018-09-19deleted 2018-09-202018-09-27 do not need to delete2018-09-29 do not need to delete2018-09-30 do not need to delete2018-10-08 do not need to delete2018-10-11 do not need to delete2018-10-24 do not need to delete2018-10-25 do not need to delete2018-10-26 do not need to delete2018-10-27 do not need to delete2018-10-28 do not need to delete2018-10-29 do not need to delete2018-10-30 do not need to delete2018-10-31 do not need to delete2018-11-01 do not need to delete2018-11-02 do not need to delete2018-11-06 do not need to delete2018-11-07 do not need to delete2018-11-08 do not need to delete2018-11-09 do not need to delete2018-11-14 do not need to delete2018-11-15 do not need to delete2018-11-30 do not need to delete2018-12-02 do not need to delete2018-12-03 do not need to delete2018-12-04 do not need to delete2018-12-05 do not need to delete2018-12-06 do not need to delete2018-12-07 do not need to delete2018-12-08 do not need to delete2018-12-09 do not need to delete2018-12-10 do not need to delete2018-12-11 do not need to delete2018-12-12 do not need to delete脚本执行看, 查看, 发现2018年9月27号之前的日志和日志目录都被删除了.[root@localhost pay-sign-oper]# ls2018-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-122018-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.sh2018-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.log2018-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 -ltotal 136drwxr-xr-x 2 root root 4096 Dec 13 14:56 2018-09-27drwxr-xr-x 2 root root 4096 Dec 13 14:56 2018-09-29drwxr-xr-x 2 root root 4096 Dec 13 14:55 2018-09-30drwxr-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-10drwxr-xr-x 2 root root 4096 Dec 13 12:40 2018-12-11drwxr-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-272018-09-292018-09-302018-10-08......................2018-12-102018-12-112018-12-12[root@localhost pay-sign-oper]# ls -l|grep "drwxr"|awk '{print $9}'|awk -F"-" '{print $1$2$3}'20180927201809292018093020181008......................201812102018121120181212 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-42018[root@localhost pay-sign-oper]# echo 20180927|cut -c 5-609[root@localhost pay-sign-oper]# echo 20180927|cut -c 7-827 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}的数值时, 就打印不要删除的信息.

转载地址:http://pdoda.baihongyu.com/

你可能感兴趣的文章
动态 布局文件 外边距
查看>>
Repeater中ImageBtn的删除等操作
查看>>
Oracle_C# 实现 Oracle Text(全文检索)的一个简单例子
查看>>
游戏脚本
查看>>
60、date的使用
查看>>
vb 打开 webbrowser
查看>>
你应该实现在网站上的30个jQuery插件
查看>>
使用浏览器统计
查看>>
【转载】 iphone使用NSOperationQueue简化多线程开发
查看>>
用户登录尝试
查看>>
MySQL默认是没有开启远程访问控制的。
查看>>
再用正则表达式及今日总结
查看>>
Struts2---->fielderror显示处理
查看>>
Android入门之增删改查通讯录
查看>>
ASP.NET AJAX入门系列(5):使用UpdatePanel控件(二)
查看>>
超过30个超棒的漂亮iphone 4s墙纸
查看>>
ASPxGridView1用法2
查看>>
LINQ 学习笔记7
查看>>
C++的cout高阶格式化操作
查看>>
GNU make manual 翻译( 一百七十七)
查看>>