一般说明:日志文件通常不完整。给出了日期时间格式,但通常缺少时区。当夏令时开始发挥作用时,如果您错过了您的时区,它可能会破坏您的全部业力。
注意:在以下所有命令中,将假定日志文件中的日期为 UTC,并且系统以 UTC 运行。如果不是这种情况,请注意夏令时会在夏令时开始时运行以下任何命令时产生问题。
date 和 awk 的组合:(不是 POSIX)
如果您的 date 命令具有 -d 标志(不是 POSIX),您可以运行以下命令:
awk -v r="(date -d '300 seconds ago' '+%F %T.%3N)" '(r < $0)'
仅限 GNU awk:
如果你想使用mktime,那就更简单了:
awk 'BEGIN{s=systime();FS=OFS="."}
{t=$1;gsub(/[-:]/," ",t); t=mktime(t)}
(t-s < 300)' logfile
我会假设将来不会创建日志文件,所以所有时间总是小于系统时间。
POSIX:
如果您不能使用mktime,但只想使用posix,这也意味着date 没有-d 标志,您可以创建自己的mktime 实现。请注意,此处提供的版本不会像 mktime 那样进行任何时区更正。 mktime_posix 假定 datestring 是 UTC
awk -v s="$(date +%s)" '
# Algorithm from "Astronomical Algorithms" By J.Meeus
function mktime_posix(datestring, a,t) {
split(datestring,a," ")
if (a[1] < 1970) return -1
if (a[2] <= 2) { a[1]--; a[2]+=12 }
t=int(a[1]/100); t=2-t+int(t/4)
t=int(365.25*a[1]) + int(30.6001*(a[2]+1)) + a[3] + t - 719593
return t*86400 + a[4]*3600 + a[5]*60 + a[6]
}
BEGIN{FS=OFS="."}
{t=$1;gsub(/[-:]/," ",t); t=mktime_posix(t)}
(t-s <= 300)' logfile
相关:this answer、this answer