awk按时间段截取日志

图片来源:https://www.pixiv.net/artworks/42320059

大多日志都会在行首添加时间信息,通过在awk脚本内调用date命令把时间信息转换为时间戳进行比较实现日志截取

以linux启动日志为例,以空格为分隔符的话,前三个字段为时间信息

Nov 11 12:51:44 archlinux kernel: microcode: microcode updated early to revision 0xf0, date = 2021-11-12
Nov 11 12:51:44 archlinux kernel: Linux version 6.0.2-arch1-1 (linux@archlinux) (gcc (GCC) 12.2.0, GNU ld (GNU Binutils) 2.39.0) #1 SMP PREEMPT_DYNAMIC Sat, 15 Oct 2022 14:00:49 +0000
Nov 11 12:51:44 archlinux kernel: Command line: initrd=\intel-ucode.img initrd=\initramfs-linux.img root=PARTUUID=10b213f0-2653-4c20-af2f-3195c1667158 zswap.enabled=0 rootflags=subvol=@ rw intel_pstate=no_hwp rootfstype=btrfs
...

下面的脚本截取 2022-11-11 12:51:44 ~ 2022-11-11 12:52:44 这一分钟内的日志(执行:./logfilter.awk boot.log

#!/usr/bin/awk -f
BEGIN{
    stime = to_ts("2022-11-11 12:51:44")
    etime = to_ts("2022-11-11 12:52:44")
}
{
    ts = to_ts($1" "$2" "$3)
    if (ts >= stime && ts <= etime)
        print $0
}
function to_ts(time){
    "date -d \""time"\" +%s" | getline ts
    return ts
}

或者略微修改一下,通过命令行传入起止时间

#!/usr/bin/awk -f 
BEGIN{
    stime = to_ts(st)
    etime = to_ts(ed)
}
{
    ts = to_ts($1" "$2" "$3)
    if (ts >= stime && ts <= etime)
        print $0
}
function to_ts(time){
    "date -d \""time"\" +%s" | getline ts
    return ts
}

用法

awk -f logfilter.awk -v st="2022-11-11 12:51:44" -v ed="2022-11-11 12:52:43" boot.log
知识共享许可协议
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。

发表评论

您的电子邮箱地址不会被公开。 必填项已用 * 标注