筛选给定范围内的日志

mktime

grep/sed/awk可以用正则去筛选日志时,如果要精确到小时、分钟、秒,则非常难以实现。

但是awk提供了mktime()函数,它可以将时间转换成epoch时间值。也就是mktime函数创建指定时间,转化为时间戳。时间戳,这个概念在许多地方有用到,简单来说就是,距离1970-01-01 00:00:00的秒数,有了这个尺度,我们就可以将时间圈定在一定范围。
写法样式

$ awk 'BEGIN{print mktime("2023 08 05 04 30 10")}'

指将,2023-08-05 04:30:10转换为时间戳

由此,我们如果想要搜寻日志信息

2020-10-1T03:42:40+08:00格式的字符串转换成epoch值

BEGIN{
  which_time = mktime("2023 08 01 12 20 48")  //先构建时间的epoch值,需要从啥时间选啥时间
}
{
  match($0,"^.*\\[(.*)\\].*",arr)   //取出日志中的时间字符串部分

  tmp_time = strptime1(arr[1])  //将时间字符串构建为epoch值

  if(tmp_time > which_time){print)  //进行比较,打印出来的就是给定的which_time到tmp_time的日志信息
}

//下面是函数方法
function strptime1(str,arr, Y,M,D,H,m, S)
 patsplit(str,arr,"[0-9]{1,4}")
 Y=arr[1]
 M=arr[2]
 D=arr[3]
 H=arr[4]
 m=arr[5]
 S=arr[6]
return mktime(sprintf("%s %s %s %s %s %s", Y,M,D,H, m, s))
}

10/Nov/2021:12:53:43+08:00格式的字符串转换成epoch值

BEGIN{
  # 要筛选什么时间的日志,将其时间构建成epoch值
  which_time = mktime("2023 08 04 11 30 40")
}

{
  # 取出日志中的日期时间字符串部分
  match($0,"^.*\\[(.*)\\].*",arr)
  
  # 将日期时间字符串转换为epoch值
  tmp_time = strptime2(arr[1])
  
  # 通过比较epoch值来比较时间大小
  if(tmp_time > which_time){
    print 
  }
}

# 构建的时间字符串格式为:"11/Nov/2021:12:53:44+08:00"
function strptime2(str,dt_str,arr,Y,M,D,H,m,S) {
  dt_str = gensub("[/:+]"," ","g",str)
  # dt_sr = "11 Nov 2021 12 53 44 08 00"
  split(dt_str,arr," ")
  Y=arr[3]
  M=mon_map(arr[2])
  D=arr[1]
  H=arr[4]
  m=arr[5]
  S=arr[6]
  return mktime(sprintf("%s %s %s %s %s %s",Y,M,D,H,m,S))
}

function mon_map(str,mons){
  mons["Jan"]=1
  mons["Feb"]=2
  mons["Mar"]=3
  mons["Apr"]=4
  mons["May"]=5
  mons["Jun"]=6
  mons["Jul"]=7
  mons["Aug"]=8
  mons["Sep"]=9
  mons["Oct"]=10
  mons["Nov"]=11
  mons["Dec"]=12
  return mons[str]
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

线粒体2.0

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值