我有一个名为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
但是此脚本提供的结果与源文件相同。
时间格式匹配出现问题,因为它没有提供最后一小时的记录。
最佳答案
我知道我迟迟无法帮助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
为true时,awk打印当前行(日志条目)。