我编写了一个脚本来打印日志文件结束前 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