awk将多个参数与变量进行比较

时间:2017-04-20 19:35:53

标签: bash awk

我尝试在过去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

1 个答案:

答案 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

编辑:要使用dateawk检索过去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总是小于星期四。

更通用的解决方案(例如,具有可参数化的小时数)将需要将日期转换为例如从纪元开始,然后比较这个值。