将日期字符串(例如 20 July 2017)转换为纪元并在 Linux 中进行比较

将日期字符串(例如 20 July 2017)转换为纪元并在 Linux 中进行比较

我正在使用 ksh,并且有一个包含几行以下内容的文本文件。我试图将日期部分与当前日期进行比较并找出天数差异,然后将文件的“Server”和“Qmgr”部分输出到另一个文件

这是我的输入文件

server1        :       Qmgr1      :       20 July 2017
server2        :       Qmgr2      :       22 July 2017
server3        :       Qmgr3      :       22 Dec 2015

如果当前日期与文件中的日期之间的差异小于 90 天,则预期输出应为

服务器3:Qmgr3

什么可能是最简单的方法来做到这一点。

答案1

尝试这个。该脚本读取命令行或标准输入上列出的文件,并打印每行的服务器和 qmgr 值,其中日期为未来 90 天或更短的时间。

#!/bin/sh

# also works with ksh, bash, zsh

now=$(date +%s)
ninety_days=$(( 90 * 24 * 60 * 60 ))

cat "$@" |
while read server colon qmgr colon2 qdate
do
    future=$(date +'%s' -d "$qdate")
    if [  $((future - now))  -lt  $ninety_days  ]
    then
        echo "$server $colon $qmgr"
    fi
done

解释:

将“纪元”(1970-01-01 UTC)和当前时间之间的秒数存储在变量中now

now=$(date +%s)

计算 90 天包含的秒数:

ninety_days=$(( 90 * 24 * 60 * 60 ))

将从记录的最后 3 个字段读取的日期转换为“纪元”与该日期之间的秒数。存储在变量中future(这样命名是为了在与变量比较时清楚起见now):

    future=$(date +'%s' -d "$qdate")

减去nowfromfuture以获取当前日期与文件中的日期之间的秒数。我们已经计算了 90 天中包含的秒数,因此我们可以将其与future和之间的差异进行比较now

    if [  $((future - now))  -lt  $ninety_days  ]

相关内容