1. 将某个时间段的nginx的access.log日志进行收集
access.log日志为:
10.0.0.1 - - [14/May/2020:16:25:15 +0800] "GET /undefined HTTP/1.1" 404 153 "http://10.0.0.127:8801/" "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko Core/1.63.6735.400 QQBrowser/10.2.2614.400" "-"
10.0.0.1 - - [14/May/2020:16:25:25 +0800] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko Core/1.63.6735.400 QQBrowser/10.2.2614.400" "-"
10.0.0.1 - - [14/May/2020:16:25:28 +0800] "GET /undefined HTTP/1.1" 404 153 "http://10.0.0.127:8801/" "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko Core/1.63.6735.400 QQBrowser/10.2.2614.400" "-"
思路:怎么进行时间段的比较,怎么将该时间段内产生日志的行号记录下来,怎么通过行号进行收集
解决:
(1)通过查找awk命令发现,它里面可以让格式一定的时间戳进行对比,而且能通过-v传变量,但是在执行过程中像bash 1.sh 1 2
不能将$1、$2传入一条命令的第二个awk的变量中;
(2)#sed –n 数字+p 1.txt 则可以对特定行号的内容打印出来
于是有方式一:
cat x.sh
#!/bin/bash
fx() {
cat /usr/'local'/nginx/logs/access.log |awk '{print $4}' >7.txt #截取日志的时间
cat 7.txt|awk -v num1=$time1 -v num2=$time2 -F'/' '$3 >= num1 && $3 <= num2 {print NR}' > 55.log #截取时间段内日志在第几行
>66.txt
for i in `cat 55.log`
do
sed -n $i'p' /usr/'local'/nginx/logs/access.log >>66.txt #将日志存入66.txt
done
}
while :
do
read -ep "请输入开始时间
(格式如: yyyy:mm:dd:ss):" time1
read -ep " 请输入结束时间:" time2
if echo $time1,$time2| grep -Eq "[0-9]{4}:[0-9]{2}:[0-9]{2}:[0-9]{2},[0-9]{4}:[0-9]{2}:[0-9]{2}:[0-9]{2}" > /dev/null 2>&1 #判断输入格式
then
fx
exit
else
echo "时间格式错误!请重新输入!"
fi
done
执行过程:
注意:这个不能精确到月和日,收集哪年的哪时哪分哪秒
方式二,awk可以比较大小,所以也可以这样:
cat xxx.sh
#!/bin/bash
tima=`echo $1|awk -F':' '{sum=$1*3600+$2*60+$3}{print sum}'`
timb=`echo $2|awk -F':' '{sum=$1*3600+$2*60+$3}{print sum}'`
awk -v time1=$tima -v time2=$timb -F':' '{sum=$2*3600+$3*60+$4}sum >= time1 && sum <= time2 {print $0}' /usr/'local'/nginx/logs/access.log
执行过程:
注意:这个是收集哪时哪分哪秒,不管哪年哪月哪日
方式三,后来又有发现:https://www.cnblogs.com/weiyiming007/p/12177429.html中,时间格式:
14/May/2020:16:25:15
这样的awk都可以直接比较
所以有:
cat xx.sh
#!/bin/bash
#格式要对!
awk -v time1=$1 -v time2=$2 '{split($4,array,"[");if(array[2]>=time1 && array[2]<=time2){print $0}}' /usr/'local'/nginx/logs/access.log
这样一条命令就可以截取日志。
执行结果如图:
注意:这个是精确到哪年哪月哪日哪时哪分哪秒