如何在shell脚本中比较没有年份参数的日期?

如何在shell脚本中比较没有年份参数的日期?

我在 Linux 中有一个日志文件,如下所示:

Mar  2 09:46:45 [rest of the log]

由于 Debian Linux 中的许多服务日志不包含年份信息,我猜是因为日志意味着最近发生的事件。

我想检查这行日志是否是最后十分钟,所以我这样做了:

Now="$(date '+%b %d %H:%M:%S')"
echo "Now : $Now"

TENMINSEC=$(date -d 'now - 10 minutes' '+%s')
echo "Ten min before : ${TENMINSEC}"

LOGDAT=$(date -d 'Mar  2 09:45:40' '+%s')
echo "LOGDAT : ${LOGDAT}"

if [ $LOGDAT -ge $TENMINSEC ];then 
    echo "Log date is greater"; 
fi

它将 LOGDAT 和最后十分钟转换为秒并进行比较。

但我很困惑它是否正在做我想要它做的事情?如果不包含年份信息,对结果没有影响吗?我该如何修复它?

附:

我没有问题,读取日志文件行。从日志文件中读取的内容将替换为代码中的日期 (Mar 2 09:45:40);

答案1

如果日期字符串中没有给出年份,GNU date(您似乎正在使用)将假定日期是指当前年份:

$ date -d 'Mar  2 09:45:40'
Sat Mar  2 09:45:40 CET 2019

因此,将此日期转换为 Unix 时间并将其与相同格式的其他日期进行比较,会做正确的事情,除了新年前夕的午夜左右。

答案2

如果您不确定 date 命令针对给定日期生成什么,您可以随时尝试。在这种特定情况下,您可以删除+%s以便可以读取结果:

date -d 'Mar 2 09:45:40'    # "02 Mar 2019 09:45:40"

或者,给定自纪元以来的时间(以秒为单位),您可以将该值转换回可读日期:

time=1546300800
date --date "@$time"        # "01 Jan 2019 00:00:00"

相关内容