检查日期字符串以及是否已经过去超过 1 小时

检查日期字符串以及是否已经过去超过 1 小时

我有一个脚本,根据日期列出 IPTIMENOW=$(date +"%m-%d-%Y-%H:%M")

进入我的文件/root/deny.conf

deny xxx.xxx.xxx.xxx; # 03-03-2021-16:43

但是我想知道如何拉出最后一行deny.conf并检查自添加最后一个 IP 以来是否已经过去了 1 小时以上。

例如,如果日期是现在03-03-2021-17:43或更晚,并且最后列出的行的值deny.conf将为deny xxx.xxx.xxx.xxx; # 03-03-2021-16:43true,然后它会 bash 另一个名为/root/pass.sh

答案1

最简单的方法是使用不同的时间戳;+'%Y-%m-%d %H:%M'会让您进行简单的计算和比较。例如:

date -d '2018-11-24 23:09 +1 hour' +'%Y-%m-%d %H:%M'

给出2018-11-25 00:09.

date也可以用来转换为从时间开始(1970-01-01 00:00:00 UTC)开始的秒数,当然,1小时就是3600秒。

如果您不想更改时间戳,则可能需要转换为date接受的内容,例如:

timestamp='11-22-2021-16:43'
datepart=${timestamp%-*}
month=${datepart%%-*}
# etcetera

编辑:您的评论表明您需要比我上面给出的提示更多的信息。

您可以使用以下命令从文件中获取最后日期

timestamp=$(grep deny /root/deny.conf | tail -1 | sed 's/.*# *//')

您可以将其转换为自 EPOCH 以来的秒数

sects=$(date -d "$timestamp" '+%s')

和当前时间戳:

now=$(date +%s)

进而

if [ $((sects+3600)) -le $now ] ; then
    echo "Long ago, in history almost forgotten"
else
    echo "Quite recent"
fi

请注意,如果您进行字符串比较,并且使用正确的日期格式,那么这也将起作用:

timestamp=$(grep deny /root/deny.conf | tail -1 | sed 's/.*# *//')
hourago=$(date -d '1 hour ago') +'%Y-%m-%d %H:%M'
if [ "$timestamp" > "$hourago" ] ; then
    echo "It just happened!"
else
    echo "Ancient history"
fi

答案2

您可以根据现在和所需日期自纪元以来的秒数进行计算。

#!/bin/bash
for last_line in "$(tail -n1 ./deny.log)"; do
    
    # skip the last line if empty
    [ "${#last_line}" -eq 0 ] && continue 

    # Getting only the date from the last line of input
    last_date=`grep -Po "(?<=# )(\d{2}-){2}\d{4}-\d{2}:\d{2}$" <<< $last_line`
    
    # LastDay : Assuming the first fiels represent the day
    ld=`cut -d- -f1 <<< $last_date`

    # LastMonth
    lm=`cut -d- -f2 <<< $last_date`

    # LastYear
    ly=`cut -d- -f3 <<< $last_date`

    # Last Hour and minute
    lh_m=`cut -d- -f4 <<< $last_date`

    # Build the date and get its time from epoch
    last_date_from_epoch=`date --date="${ly}-${lm}-${ld}T${lh_m}" +"%s"`

    # Get the 'now' time from epoch
    now=`date +"%s"`

    # The second in an hour
    hour_in_sec=$((60 * 60))

    # The difference, in seconds, from now and the last log
    difference=$((now - last_date_from_epoch))

    # If an hour, or more, is passed, call the script 
    [ "$difference" -lt "$hour_in_sec" ] || /root/pass.sh
done

相关内容