在linux生产环境下,有如下这样的一个平常运维需要的工作。
每隔一段时间,比如两个小时,就要对每秒都要产生日志的日志文件(这里假设为testfile.out,其绝对路径为/home/panlm/shellpra/testfile.out)进行一个操作,这个操作是将日志中包含某些字符串的行给单独打印出来,并重新放在一个文件(这里的文件假设为out.log)中。这些需要匹配的字符串可以按这种方式表示“0x216000ab”其中ab为01到18的连续整数。
实现这样一个要求的做法主要有两步
一、通过shell脚本,实现将目标日志中满足要求的行输出到一个新的文件中。
二、通过crontab部署该脚本每两个小时运行一次
testfile.out 的内容如下
1231 0x21600001
32343 0x21600002
23123 0x21600003
42232 0x21600004
22323jkshdkfkadlfdsd
fjsdkdjf 0x21600018
sdafd 0x21600043
sajdkfjjjjls
一、shell脚本实现
脚本名称为get.sh
#!/bin/bash
#define vars
Log_File="/home/panlm/shellpra/testfile.out
sum=1
#将字符串"0x216000ab"分为两部分,一部分为字符串固定部分,一部分为可变的整数部分
str1="0x216000"
str2="0x2160000"
for i in {1..18}
do
if [ "$sum" -lt 10 ]
then
#将两个字符串合并成一个字符串
str=${str2}${sum}
#将满足结果的行数输出到结果文件out.log中
grep $str $Log_File |cat >> out.log
let "sum=$sum+1"
else
str=${str1}${sum}
#将满足结果的行数输出到结果文件out.log中
grep $str $Log_File |cat >> out.log
let "sum=$sum+1"
fi
done
执行该脚本后得到的文件out.log内容如下
1231 0x21600001
32343 0x21600002
23123 0x21600003
42232 0x21600004
fjsdkdjf 0x21600018
二、每隔两个小时执行下该脚本
0 */2 * * * /home/panlm/shellpra/get.sh