设想
我的容器的上次部署日期格式如下:
月/日/年或 2024 年 2 月 11 日。
我无法更改他们输出上次部署日期的方式。
我想从当前日期中减去上次部署日期,然后如果上次部署日期超过 2 个月,则写入文件。
示例container1-last-deploy.txt:
last deployed: jan/01/2024
我有几个这样的文件。
挑战在于月份是用字母给出的。我可以使用正则表达式来获取日期。
我想到的一个解决方案是将月份放在字典中,例如:
dict=(
['jan']=1
['feb']=2
)
但一定有更好的方法。
是否可以将字母月份转换为整数?
这是针对 macOS 上的 bash,最好是 bash 3 解决方案。
MacOS
date
- 将日期字符串转换为自纪元以来的秒数date
命令可以通过libc函数理解字符串格式的月份strptime(3)
。我没有 macos,所以我无法测试我的答案,但根据 macosdate
手册页:[...]
现在您只需要了解如何从手册页中设置输入日期的格式
strptime(3)
:所以根据这个,输入格式应该是:
"%b/%e/%Y"
。接下来,您需要使用以下标志
date
:最后,由于您希望能够从结果中减去当前时间,因此您需要确保您的 + output_fmt为:
因此,将日期格式转换为纪元的结果命令应该是:
再说一次,因为我没有 Macos,所以我无法测试这一点来确认。我也不确定它是否会接受小写的月份,但如果您必须将月份大写,您可以替换
$DATE
为${DATE^}
为了完整起见,我还将展示如何使用以下命令执行相同的操作:
GNU
date
- 将日期字符串转换为自纪元以来的秒数这更容易一些,因为 GNU 版本
date
给予了更多自由从其手册页:
因此,从我在机器上的测试来看,您应该从输入中删除斜杠,以便
date
命令理解它:从当前日期中减去
现在您已获得原始日期的纪元时间。只需将其存储到变量中即可。例如,在 MacOS 中:
要查看自纪元以来的当前日期(以秒为单位):
所以现在要计算以秒为单位的差异,这很简单:
您应该尝试获得确切的要求(也许您有这些要求,但您没有在此处说明)。
一是月份缩写所假定的区域设置。例如,在德语区域设置中,在解析纯英语应用程序打印的日期时,几个月的名称可能会导致问题(例如,德语中的
may
ismai
和oct
isokt
)。如果使用的月份名称与当前区域设置匹配,则
date -d "$(echo jan/01/2024 | tr / ' ')"
可以简单地解析部署日期。另一个问题是如何计算日期差异:
如果您要计算天数(大约 60 天),您可以使用格式
+%s
参数将部署日期和当前日期转换为秒,减去这些数字,然后检查结果是否大于 60*86400。如果您想遵守一些更复杂的规则(例如,比较月份中的某一天),您仍然可以在 bash 中执行此操作,但会变得更加困难。
使用任何
date
和任何awk
都会执行您所描述的操作:上面的代码是在此输入文件上运行的:
如果输入中的月份名称不全是小写,例如
Jan
或JAN
,则只需在脚本中更改$3
为。tolower($3)