从日志时间的特定时间打印

我写了一个脚本在日志文件结束前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 - "" "" 

一个build议,GNUdate命令(在大多数Linux系统上可以find)可以采用dateexpression式:

  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)获得开始date并格式化(2)find文件中的点,(3)打印。 这可以通过多种方式完成,可能在日志文件中使用简单的sed语句。

编辑成分:

具体来说,这应该工作:(不保证被充分testing,但工作!)

  #! /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