gpt4 book ai didi

linux - 如何使用awk命令在Linux中获取最近一小时的日志

转载 作者:太空宇宙 更新时间:2023-11-04 05:43:00 24 4
gpt4 key购买 nike

我有一个名为 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

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

最佳答案

我知道我迟到了,但也许这个答案可以帮助处于这种情况的其他人。

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

请注意,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 会打印当前行(日志条目)。

关于linux - 如何使用awk命令在Linux中获取最近一小时的日志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41158692/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com