将某个时间段的nginx的access.log日志进行收集

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

执行过程:
将某个时间段的nginx的access.log日志进行收集注意:这个不能精确到月和日,收集哪年的哪时哪分哪秒

方式二,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

执行过程:
将某个时间段的nginx的access.log日志进行收集注意:这个是收集哪时哪分哪秒,不管哪年哪月哪日

方式三,后来又有发现:https://www.cnblogs.com/weiyiming007/p/12177429.html中,时间格式:

14/May/2020:16:25:15

这样的awk都可以直接比较
将某个时间段的nginx的access.log日志进行收集
所以有:
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                                                                                                          

这样一条命令就可以截取日志。
执行结果如图:
将某个时间段的nginx的access.log日志进行收集
注意:这个是精确到哪年哪月哪日哪时哪分哪秒

上一篇:Python对时间数据进行运算


下一篇:残差加se块pytorch实现