我想要日期输出格式如下...
01/01/2020
02/01/2020
03/01/2020
04/01/2020
05/01/2020
06/01/2020
07/01/2020
08/01/2020
09/01/2020
10/01/2020
11/01/2020
12/01/2020
13/01/2020
14/01/2020
15/01/2020
16/01/2020
17/01/2020
18/01/2020
19/01/2020
20/01/2020
21/01/2020
22/01/2020
23/01/2020
24/01/2020
25/01/2020
26/01/2020
27/01/2020
28/01/2020
29/01/2020
30/01/2020
目前我正在使用...
cal 01 2020 | grep -v "[A-Z][a-z]"| tr ' ' '\n' | sort -n | awk '$1~/[0-9]/ { printf "%02s/%02s/%4s\n",$1,"01","2020"}'
01/01/2017
我想要上面的格式31/12/2019
。我该怎么做
答案1
#!/bin/bash
timestamp=$( date -d '2017-01-01 12:00' +%s )
while [ "$thedate" != '31/12/2019' ]; do
printf -v thedate '%(%d/%m/%Y)T' "$timestamp"
timestamp=$(( timestamp + 86400 ))
printf '%s\n' "$thedate"
done
上面的脚本首先使用 GNUdate
获取开始日期中午的 UNIX 时间戳(它将是1483268400
)。然后迭代,直到找到并输出结束日期。在每次迭代中,我们增加timestamp
86400 秒(24 小时)。
printf
日期字符串是使用 中的内置实用程序生成的bash
,该实用程序能够使用其%(...)T
格式从 UNIX 时间戳格式化日期时间字符串(这需要bash
版本 4.3 或更高版本)。它还直接打印到thedate
带有 的变量-v
。
在某些没有 GNU 的系统上date
,您可以使用date
另一种格式的命令行参数通过本机实用程序获取开始日期的时间戳。例如,在 OpenBSD 上,它是通过
date -j +%s 201701011200
请man date
参阅您的特定 Unix。
awk
还可以使用一些扩展实现:
awk 'BEGIN { print mktime("2017 01 01 12 00 00") }'
但如果你有这样的awk
(GNUawk
或mawk
),那么你不妨在 中完成整个事情awk
:
awk '
BEGIN {
timestamp = mktime("2017 01 01 12 00 00")
while (thedate != "31/12/2019") {
thedate = strftime("%d/%m/%Y", timestamp)
timestamp += 86400
print thedate
}
}'
答案2
您需要添加一个嵌套的 for 循环,其中包含当年和下个月的第一次迭代。对于每个月,您都会执行已经完成的操作,在 awk 末尾打印月份和年份。