通过读取数字显示特定天数后的日期

通过读取数字显示特定天数后的日期

我有一个文件,其中有一行:

Password=md@2507

其中 2507 是我最后一次更改密码的日期。我想要一个从该文件的密码行读取日期的脚本,然后显示 10 天后的日期,因为该密码将在该日期的 10 天后过期。

答案1

使用 GNUsed和 GNU date

sed -En 's#^Password=.*@([0-9]{2})([0-9]){2}$#date -d "\2/\1 +10 days" +%F#ep'

我们将 2507 改为 07/25,因为 GNUdate预计日期采用美国风格。但请注意,07/25 被理解为 7 月 25 日今年的

这意味着,如果您在 2017 年 1 月 2 日对Password=x@2712输入运行该命令,您将获得2018-01-06输出(12 月 27 日后 10 天)2017年)。

你可以做的是:

eval "$(date +'d=%d m=%m y=%Y')"
awk -v "y=$y" -v "today=-$m-$d" -F @ '
  /^Password=.*@[0-9]{4}$/ {
    d = "-" substr($NF, 3) "-" substr($NF, 1, 2)
    d = (d > today ? y - 1 : y) d
    system("date -d \"" d " +10 days\" +%F");
  }'

在 中eval "$(date +'d=%d m=%m y=%Y')",我们获取 date 以格式输出当前日期d=25 m=07 y=2016。我们将其作为 shell 代码进行评估,以便设置$d$m$yshell 变量。这比 do 更好,d=$(date +%d) m=$(date +%m) y=$(date +%Y)因为它只运行一个date命令,并且可以避免在该月最后一天的 23:59:59.9 运行该命令时出现的问题。

然后我们运行awk,将awk 变量设置为shell 变量 ( )y的内容并设置为.$y2017today-01-02

在 中awk,如果当前记录与^Password=.*@[0-9]{4}$正则表达式匹配。也就是说,如果它以 4 位十进制数字开头Password=和结尾,那么我们:@

  • 提取最后 4 位数字中的日期并将其存储在d变量中,-mm-dd就像today.

  • 如果d在词法上大于today,例如在上面的示例中-12-27大于-01-02,则我们设置d为 ( ) 之前的年份2016-12-27,否则设置为当前年份。

  • 然后我们运行date -d "2016-12-27 +10 days" +%F命令。假设 GNUdate这意味着以 指定的%F格式(即)打印日期,即 2016-12-27 后 10 天。YYYY-MM-DD2016-12-27 +10 days

相关内容