如何使用awk命令获取linux中最后一小时的日志

时间:2016-12-15 07:32:43

标签: linux awk

我有一个名为source.log的日志文件,其时间格式如下: -

Fri, 09 Dec 2016 05:03:29 GMT 127.0.0.1

我正在使用脚本从日志文件中获取最近1小时的日志。

脚本: -

awk -vDate=`date -d'now-1 hour' +[%d/%b/%Y:%H:%M:%S` '$4 > Date {print Date, $0}' source.log > target.log

但是这个脚本给出的结果和源文件一样。 时间格式匹配有问题,因为它没有给出最后一小时的记录。

1 个答案:

答案 0 :(得分:1)

我知道我很晚才能帮助OP,但也许这个答案在这种情况下可以帮助其他人。

首先,有必要比较整个日期而不仅仅是时间部分,因为接近午夜的时间。

请注意,awk只能比较字符串和数字。一些awk实现具有mktime()函数,可将特定格式的字符串转换为UNIX timestamp,以便进行日期时间比较,但它不支持任何日期时间格式,因此我们无法实现用它。

最好的方法是使用'YYMMDDhhmmss'日期时间格式或ISO format更改(如果可能)日志条目的日期时间格式。通过这种方式,比较两个日期时间很简单,比较字符串或数字。

但我们假设我们无法更改日志条目的日期格式,因此我们需要在awk内转换自己:

awk -vDate="`date -d'now-1 hour' +'%Y%m%d%H%M%S'`" '
    BEGIN{
        for(i=0; i<12; i++)
            MON[substr("JanFebMarAprMayJunJulAugSepOctNovDec", i*3+1, 3)] = sprintf("%02d", i+1);
    }
    toDate() > Date
    function toDate(){
        time = $5; gsub(/:/, "", time);
        return $4 MON[$3] $2 time;
    }' source.log

<强>解释

  • -vDate=...使用初始日期时间(一小时前)设置Date awk变量。
  • BEGIN部分创建一个由月份缩写索引的数组(它特别针对英语)
  • toDate()函数将行的字段转换为与Date变量(YYYMMDDhhmmss)格式相同的字符串。
  • 最后,当条件toDate() > Date为真时,awk会打印当前行(日志条目)。