使用shell脚本遍历日期
1. 按天倒序遍历日期 ( 正序修改一下日期增减函数即可 )
#!/bin/bash
#倒序按天遍历日期
#传入遍历的开始时间和结束时间
startdate="$1"
enddate="$2"
echo 'startdate: '$startdate
echo 'enddate: '$enddate
echo "-----------------------------------"
#序列1-300,表示遍历300次,因为有结束时间的限制,所以实际上不会循环300次
for i in `seq 1 300`; do
#当开始时间小于结束时间时,直接结束脚本
if [[ $startdate -lt $enddate ]]; then
break
fi
echo $startdate
#执行hiveSQL脚本,我是需要按日期执行hiveSQL,这里可以无视
hive -hiveconf input_date=$startdate -f mergeSmallFiles.sql # >> mergeSmallFiles.txt
#每次执行后,使开始日期减一天,如果要正序,将下面-1换成+1即可,当然开始时间和结束时间也要换一下
startdate=$(date -d "$startdate -1 day" +%Y%m%d)
done
运行结果如下:
2. 按小时倒序遍历日期 ( 正序修改一下日期增减函数即可 )
因为shell中没有小时加减的函数,所以这里要做几个步骤:
#!/bin/bash
#倒序按小时遍历时间
startdate="$1"
enddate="$2"
echo 'startdate: '$startdate
echo 'enddate: '$enddate
echo "-----------------------------------"
for i in `seq 1 300`; do
if [[ $startdate -lt $enddate ]]; then
break
fi
echo $startdate
#拼接成YYYYmmdd HH的格式,否则使用下个命令中+%s,会无法转换
startdate=${startdate:0:4}"-"${startdate:4:2}"-"${startdate:6:2}" "${startdate:8:2}
#转换成时间戳,+%s为时间格式
startdate=$(date +%s -d "$startdate")
#每次执行后,开始日期减一个小时
startdate=$(($startdate-1*60*60))
#时间戳转正常格式时间
startdate=$(date +%Y%m%d%H -d "1970-01-01 UTC $startdate seconds")
#执行hiveSQL脚本,可以无视掉
hive -hiveconf input_date=$startdate -f mergeSmallFiles.sql # >> mergeSmallFiles.txt
done
运行结果如下: