【问题标题】:Get all lines that meet time condition from log file从日志文件中获取所有满足时间条件的行
【发布时间】:2018-10-17 22:13:09
【问题描述】:

这是我的日志文件的样子

[BCDID::16 T::LIVE_ANALYZER GCDID::16] {"t":"20:50:05","k":"7322","h":"178","s":-53.134575556764}
[BCDID::16 T::LIVE_ANALYZER GCDID::16] {"t":"20:50:06","k":"2115","h":"178","s":-53.134575556764}
[BCDID::16 T::LIVE_ANALYZER GCDID::16] {"t":"20:50:07","k":"1511","h":"178","s":-53.134575556764}

有多个具有相似条目的日志文件,它们每秒更新一次。

这里"t" : "20:50:05" 是时间。

我想要做的是,从文件末尾的所有文件中获取特定时间之间的所有日志。

我尝试使用tail files*.log | grep -e "20:50:07 | 20:50:05",但它没有返回任何内容。

如何从所有日志文件的文件末尾获取给定时间之间的所有日志条目?

【问题讨论】:

标签: unix grep tail


【解决方案1】:

如果您正在寻找记录的范围,并且行的格式是一致的,那么最简单的方法可能是隔离时间字段,去掉冒号,并利用算术运算符的强大功能。

单行 awk 解决方案,例如:

tail files*.log | awk -v from="205006" -v to="205007" -F"\"" '{ timeasint=$4; gsub(":","",timeasint); if (timeasint >= from && timeasint <= to) print $0 }'

会得到你:

[BCDID::16 T::LIVE_ANALYZER GCDID::16] {"t":"20:50:06","k":"2115","h":"178","s":-53.134575556764}
[BCDID::16 T::LIVE_ANALYZER GCDID::16] {"t":"20:50:07","k":"1511","h":"178","s":-53.134575556764}

当然,您不能跨越午夜(即 25:59:59 - 00:00:01),但无论如何,您都需要日志中的日期和时间。

如果您个日期,我的建议是将它们转换为纪元标记(使用 date -d "string" 或其他合适的方法)并将纪元标记作为整数进行比较。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-09
    • 2020-10-04
    • 1970-01-01
    • 2016-10-20
    • 1970-01-01
    相关资源
    最近更新 更多