从日志时间中的特定时间开始打印

从日志时间中的特定时间开始打印

我编写了一个脚本来打印日志文件结束前 5 天的内容!现在我想以某种方式更改它,使其打印文件结束前 5 小时的内容!

这是脚本:

for d in \
 $(sed -nre 's/.*\[(..)\/(...)\/(....):(..:..:..) .*/\1 \2 \3 \4/p' thttpd.log | date +%s -f-);
do echo $d >s1; done

time=$(expr 60 \* 60 \* 24 \* 5)
EDATE=`tail -1 s1`
SDATE=$[$EDATE - $time]
sd=`date -d '1970-01-01 UTC '$SDATE' seconds' +"%d/%b/%Y"`
echo $sd
awk -F'[:[]' -v vd=$sd 'BEGIN{ gsub(/\//," ",vd);"date +%s -d \""vd"\""|getline d} {p=$0;  gsub(/\//," ",$2); "date +%s -d \""$2"\""|getline o;if(o>d) print p}' ll.log

日志文件示例:

213.64.153.92 - - [26/Sep/2002:00:15:15 +0200] "GET/scripts/..%c0%af../winnt/system32/cmd.exe?/c+dir HTTP/1.0" 404 - "" ""
213.64.153.92 - - [26/Sep/2002:00:15:16 +0200] "GET/scripts/..%c1%9c../winnt/system32/cmd.exe?/c+dir HTTP/1.0" 404 - "" ""

答案1

建议,GNU date 命令(在大多数 Linux 系统上都可以找到)可以采用日期表达式:

  date --date='today-7 days 0000'   ;; print 7 days earlier than today at 0000

  date --date='26 Sep 2002 00:15:16 -5 hours'  ;; closer to your example

这可以使你的脚本编写变得更容易一些。

因此,处理过程如下:(1) 获取开始日期并格式化 (2) 定位文件中的点,以及 (3) 打印。这可以通过多种方式完成,可能只需在日志文件上使用简单的 sed 语句即可。

编辑补充:

具体来说,这应该可以工作:(不能保证经过完全测试但可以工作!)

 #! /bin/sh
 set -uh

 filename=/var/log/apache2/access_log

 lastdate=`tail -1 $filename | sed 's/^.*\[//
 s/\].*$//
 s/ .*$//
 s/\// /g
 s/:/ /'`
 newdate=`date --date="$lastdate -5 hours" +"%d\/%b\/%Y:%H:"`
 awk '/'"$newdate"'/,/^$/    {print $0}' $filename

 exit 0

相关内容