我尝试在过去24小时内解析一些错误的apache日志,并且需要将一些位置参数的组合与另一个awk变量进行比较
awk -vCurDate=`$1 $2 $3` -vDateT=`date -d'now-24 hours' +[%a %b %d %H:%M:%S:%f %Y` ' { if (CurDate > vDate) print $0 }' error_log
日志文件中行的开头如下所示:
[Sun Apr 19 03:20:14.381242 2017]
输出错误:
usage: date [-jnu] [-d dst] [-r seconds] [-t west] [-v[+|-]val[ymwdHMS]] ...
[-f fmt date | [[[mm]dd]HH]MM[[cc]yy][.ss]] [+format]
当我尝试打印出CurDate
的值时,我没有得到预期的结果。它只吐了一堆空行。是我宣布curDate
允许的方式吗?
awk -vCurDate=`$1 $2 $3` -vDateT="`date -d'now-24 hours' +'[%a %b %d'`" ' { print CurDate}' error_log
答案 0 :(得分:0)
仅调用date
:
$ date -d'now-24 hours' +[%a %b %d %H:%M:%S:%f %Y]
date: extra operand ‘%b’
Try 'date --help' for more information.
必须引用date参数,因为它包含空格。
$ date -d'now-24 hours' +"[%a %b %d %H:%M:%S:%f %Y]"
[Wed Apr 19 22:04:40:%f 2017]
我收到%f
,因为我的date
版本无法识别它:
$ date --version
date (GNU coreutils) 8.26
如果我想获得微秒精度,我必须使用%6N
将纳秒缩小到微秒:
$ date -d'now-24 hours' +"[%a %b %d %H:%M:%S:%6N %Y]"
[Wed Apr 19 22:06:34:346471 2017]
尝试将变量传递给awk
:
$ awk -vCurDate=`$1 $2 $3` -vDateT=`date -d'now-24 hours' +'[%a %b %d %H:%M:%S:%6N %Y]'` ' { if (CurDate > vDate) print $0 }' error_log
awk: fatal: cannot open file `19' for reading (No such file or directory)
date
的输出也必须引用,因为它也包含空格。
$ awk -vCurDate=`$1 $2 $3` -vDateT="`date -d'now-24 hours' +'[%a %b %d %H:%M:%S:%6N %Y]'`" ' { if (CurDate > vDate) print $0 }' error_log
编辑:要使用date
和awk
检索过去24小时内的所有日志消息,您可以使用此代码。
awk -vCurDate="`date +'[[]%a %b %d ..:..:..[.]...... %Y[]]'`" \
-vOldDate="`date -d'now-24 hours' +'[[]%a %b %d ..:..:..[.]...... %Y[]]'`" \
-vOldTime="`date -d'now-24 hours' +'[%a %b %d %H:%M:%S.%6N'`" \
'{\
if (($0 ~ "^" CurDate) \
|| ( \
($0 ~ "^" OldDate) && ($0 > OldTime) \
)) { print } }' error_log
CurDate匹配今天创建的日志 - 我们想要今天的所有日志。 OldDate匹配昨天的日志,屏蔽了几小时到几分钟。 OldTime恰好是24小时前的时间。我们选择昨天的日志时间比此更长。
所有这些都是必需的,因为时间戳格式不保持字典顺序 - 虽然日期的顺序相反,但Fri总是小于星期四。
更通用的解决方案(例如,具有可参数化的小时数)将需要将日期转换为例如从纪元开始,然后比较这个值。