【问题标题】:Unix environment — extract date strings and compareUnix 环境——提取日期字符串并进行比较
【发布时间】:2020-05-18 15:56:18
【问题描述】:

谁能帮助我使用 UNIX 脚本从文件的最后一行中提取日期,将其与当前日期进行比较,如果文件中的日期在当前日期之间有 1 小时的延迟,则回显 YES?

文件.txt

18:48:43 iLIKEtoMOVEitMoveIT
18:58:43 iLIKEtoMOVEitMoveIT
19:22:43 iLIKEtoMOVEitMoveIT
clear line

到目前为止,我想出了如何获取有时间的最后一行:

tail -n 2 File.txt | head c-8

输出 = 19:22:43 以及如何将当前日期存储为变量中的唯一时间:

TheCurrentDate="date +"%T""

如何比较这 2 个 HH:MM:SS 并计算它们之间是否经过一小时,然后回显“是”。全部放在script.sh中

【问题讨论】:

    标签: string date variables unix compare


    【解决方案1】:
    DATE=$(tail -n 2 File.txt | cut -c 1-8 | head -n 1)
    FROM_FILE=$(date -d "$DATE" +%s)
    NOW=$(date +%s)
    DIFFERENCE=$((NOW - FROM_FILE))
    
    if [ $DIFFERENCE -le 3600 ]; then
        echo YES
    fi
    

    这个想法是使用 date 将时间戳转换为自纪元 (+%s) 以来的秒数。然后你只需比较数字。

    编辑

    您的File.txt 应该看起来像一个日志文件,其中的日志记录程序不会费心在前面加上日期。正如@Jonathan Leffler 指出的那样,NOW 可能是 00:15FROM_FILE 可能是 23:45

    在这种情况下,date 会将FROM_FILE 解释为今天的结束,而不是昨天的结束。这可以临时修复:

    DATE=$(tail -n 2 File.txt | cut -c 1-8 | head -n 1)
    FROM_FILE=$(date -d "$DATE" +%s)
    NOW=$(date +%s)
    
    if [ $FROM_FILE -gt $NOW ]; then
        # it's not really in the future, it's from yesterday
        FROM_FILE=$((FROM_FILE - 24 * 3600))
    fi
    
    DIFFERENCE=$((NOW - FROM_FILE))
    
    if [ $DIFFERENCE -le 3600 ]; then
        echo YES
    fi
    

    【讨论】:

    • 如果第一次是 23:45 而下一次是 00:15 会发生什么?是不是在一个小时内?这在很大程度上取决于信息是否按时间顺序排列。通常是这样,因此这些时间可能相隔半小时。但这是 OP 应该告诉我们的。这也是始终记录日期和时间的一个令人信服的理由。
    • 嗨,正如你所说,23:45 - 00:15 仍然被认为是在小时限制内。这就是为什么日志文件会写“不时 - 没有人知道确切的时间”。而且只是时间而不是完整日期。
    • 非常感谢您根解决它!非常感谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-11
    • 1970-01-01
    • 2012-10-19
    相关资源
    最近更新 更多