如何用Bash和Awk脚本获取上月最后一天(YYYY-MM-DD格式)
获取上个月最后一天(YYYY-MM-DD格式)的实现方案
我来帮你搞定这个需求,不管是Bash还是Awk都有简洁可靠的实现方式,下面一步步说明:
Bash 最简便的写法
其实不用手动计算年份和月份,date命令本身就支持直接获取上个月最后一天,而且能自动处理跨年的情况(比如1月运行会返回去年12月31日):
date -d "$(date +%Y-%m-01) -1 day" +%Y-%m-%d
逻辑解释:
date +%Y-%m-01:先拿到当前月份的第一天(比如5月运行就是2018-05-01)-1 day:把这个日期减一天,自然就是上个月的最后一天+%Y-%m-%d:强制输出你需要的YYYY-MM-DD格式
修正你原来的Bash代码
你的代码思路没问题,但最后输出格式没调整,还可以优化日期计算逻辑(不用手动判断每个月的天数),修改后的完整代码:
#!/bin/bash cur_month=$(date +%m) cur_year=$(date +%Y) prev_month=$((cur_month - 1)) # 处理跨年情况:如果是1月,上月就是去年12月 if [ $prev_month -lt 1 ]; then prev_year=$((cur_year - 1)) prev_month=12 else prev_year=$cur_year fi # 构造上月第一天,加一个月再减一天(自动算出上月最后一天),同时指定输出格式 last_day_prev=$(date -d "$prev_year-$prev_month-01 +1 month -1 day" +%Y-%m-%d) echo $last_day_prev
这样不管是5月运行输出2018-04-30,还是1月运行输出2017-12-31,都能得到符合要求的结果。
Awk 实现方案
用Awk的时间处理函数也能轻松实现,下面给两种写法:
清晰易懂版(适合新手理解)
BEGIN { # 获取当前时间戳 now = systime() # 提取当前年份和月份(转成数字方便计算) cur_year = strftime("%Y", now) + 0 cur_month = strftime("%m", now) + 0 # 计算上月的年份和月份 if (cur_month == 1) { prev_year = cur_year - 1 prev_month = 12 } else { prev_year = cur_year prev_month = cur_month - 1 } # 构造上月第一天的时间戳,减去一天的秒数(86400秒)得到上月最后一天 first_day_prev = mktime(sprintf("%d %d 1 0 0 0", prev_year, prev_month)) last_day_prev = first_day_prev - 86400 # 格式化输出为YYYY-MM-DD print strftime("%Y-%m-%d", last_day_prev) }
简洁版(一行搞定)
如果追求代码简洁,可以把所有逻辑合并:
awk 'BEGIN {print strftime("%Y-%m-%d", mktime(strftime("%Y %m 1 0 0 0")) - 86400)}'
运行方式:直接在命令行执行上面的命令,或者把代码保存成.awk文件后用awk -f script.awk运行。
内容的提问来源于stack exchange,提问作者as7951
相关产品推荐
相关产品推荐

