2016-12-15 164 views
-3

我有一个名为source.log有时间格式的日志文件中获取在Linux中最后一小时的日志,如: -如何使用awk命令

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 

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

+0

您所展示的数据为2016美元4美元。您认为它会是什么? –

+0

4美元将是数据显示的列数。 我想写一个脚本来收集应用程序日志文件中最后1小时的日志。我的脚本正在收集日志文件中的所有日志,我只需要最后1小时的日志。 **应用程序日志文件的示例: - ** Wed,07 Dec 2016 06:44:35 GMT connect deprecated methodOverride:use method-override – Megha

+0

嗯,我建议您更改打印以显示日期和$ 4。你最好用某种东西“束缚”它们,否则你会觉得不同。即使您认为是真实的,“数据显示的列数”会如何超过您在Date中建立的数据将如何帮助您? –

回答

0

我知道我迟到了,以帮助OP,但也许这个答案可以帮助其他任何人在这种情况下。

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

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

最好的方法是使用'YYMMDDhhmmss' datetime格式或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部生成由所述月份缩写(它especific英制)
  • toDate()函数的行的字段转换为具有相同的格式Date变量(YYYMMDDhhmmss)的字符串索引的数组。
  • 最后,当条件toDate() > Date为真时,awk输出当前行(日志条目)。