我想在日志文件中查找一个日期并从该日期打印到日志文件的末尾,该日期是日志文件末尾的 5 天前,即 2002 年 12 月 27 日
日志文件如下:213.64.56.208 - - [01/Jan/2003:05:42:53 +0100]
整个脚本:
for d in \
$(sed -nre 's/.*\[(..)\/(...)\/(....):(..:..:..) .*/\1 \2 \3 \4/p' thttpd.log $
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"`
sd=$(echo $sd | sed 's/\//\\\//g')
sed -n "$(awk '/'$sd'/ { print NR }' thttpd.log | head -1),$ p" thttpd.log
问题是日志文件中没有日期 2002 年 12 月 27 日!那么现在我应该如何输入才能搜索第二天(2002 年 12 月 28 日)
213.64.237.213 - - [23/Dec/2002:03:02:22 +0100]
213.132.36.66 - - [28/Dec/2002:19:33:29 +0100]
我也遇到了这个问题!我想打印过去 5 小时,即 07:55:21,但日志文件中没有 7:55 !所以它应该从下一个项目开始打印直到 (08:08) 结束
213.64.56.208 - - [01/Jan/2003:07:53:17 +0100]
213.64.56.208 - - [01/Jan/2003:08:08:19 +0100]
答案1
你还没解决这个问题吗?
您必须$sd
用单引号括起来,并用反斜杠转义日期中的斜杠,请尝试以下操作:
sd="01/Jan/2003"
sd=$(echo $sd | sed 's/\//\\\//g')
sed -n "$(awk '/'$sd'/ { print NR }' aa.log | head -1),$ p" aa.log
PS:如有必要,请将月份名称转换为数字。