我在 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"