在处理数据时经常需要根据时间段批量回溯数据,因此在shell中使用date命令以及各种格式之间的转化就很有用,尤其是20181010和2018-10-10这两种格式,几个主要的需求如下:
1.生成today的两种格式的时间戳
date -d today +"%Y%m%d"
date "+%Y%m%d"
date -d today +"%Y-%m-%d"
date "+%Y%-m-%d"
2.两种格式之间的转化
date -d "2018-11-01" +"%Y%m%d"
date -d "20181101" +"%Y-%m-%d"
3.生成today的前一天和后一天
date -d "today 1 day ago" +"%Y%m%d"
date -d "today 1 day" +"%Y%m%d"
date -d "today 1 day ago" +"%Y-%m-%d"
date -d "today 1 day" +"%Y-%m-%d"
4.生成${dt}的前一天和后一天
date -d "${dt} 1 day ago" +"%Y%m%d"
date -d "${dt} 1 day" +"%Y%m%d"
5.根据开始和结束时间生成连续时间戳,非常有用
# 打印开始时间和结束时间之内的连续时间戳
# 网上找的思路是把年月日格式转成时间戳比大小,我的这个是把年月日格式直接转成整数比大小
#!/bin/sh
# $1是开始时间,$2是结束时间
startdate=`date -d $1 +"%Y%m%d"`
tempdate=${startdate}
enddate=`date -d $2 +"%Y%m%d"`
# 将时间戳转成整数比大小
while [ $((tempdate)) -le $((enddate)) ]
do
echo $tempdate # 20180801
#echo `date -d "$tempdate" +"%F"` # 2018-08-01
tempdate=`date -d "1 day $tempdate" +"%Y%m%d"` # 20180802
done
6.如果传入时间参数,就使用这个传入的时间,如果无参数,就使用当前日期,这样的脚本既可以做定时任务,又可用手动被调度
#!/bin/sh
if [[ $# -eq 1 ]];then
dt="${1}"
else
dt=`date "+%Y%m%d"`
fi
dt_start=`date -d "${dt}" +"%Y-%m-%d"`
dt_end=`date -d "1 day ${dt_start}" +"%Y-%m-%d"`
echo "start druid ingest ${dt_start}"
sh +x process.sh para1 "${dt_start}" "${dt_end}"
echo "end druid ingest ${dt_start}"
7.下面给出一个我用来做mysql分表的分小时的脚本,涉及到函数调用
# 分表:从大表中查找然后插入到小表,之所以要分到小时级别防止将内存占满
# 在指定时间段内生成连续时间戳
#!/bin/sh
# 对传入的day的24小时分别处理,这样虽然会造成cpu打满,但是内存没事
handleDay(){
day=$1
year_month=${day:0:6}
echo ${year_month}
hours=(0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23)
for i in ${hours[@]}
do
echo ${i}"hour start"
mysql -hremotehost -uliushilei -pmywords -D database_name -e "insert into
table_${year_month} select * from table_ori where day=${day} and hour=${i}"
sleep 3
done
}
# 主函数:$1是开始时间,$2是结束时间
startdate=`date -d $1 +"%Y%m%d"`
tempdate=${startdate}
enddate=`date -d $2 +"%Y%m%d"`
# 将时间戳转成整数比大小
while [ $((tempdate)) -le $((enddate)) ]
do
echo $tempdate “start####” # 20180801
#echo `date -d "$tempdate" +"%F"` # 2018-08-01
handleDay ${tempdate} # 逐日处理
tempdate=`date -d "1 day $tempdate" +"%Y%m%d"` # 20180802
done
8.只取时间戳中的年月
#!/bin/sh
# 201810
if [ ! -z $1 ];then
current_month=$1
else
current_month=`date -d today +"%Y%m"`
fi