我有一个文件,其中有一行:
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
和$y
shell 变量。这比 do 更好,d=$(date +%d) m=$(date +%m) y=$(date +%Y)
因为它只运行一个date
命令,并且可以避免在该月最后一天的 23:59:59.9 运行该命令时出现的问题。
然后我们运行awk
,将awk 变量设置为shell 变量 ( )y
的内容并设置为.$y
2017
today
-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-DD
2016-12-27 +10 days