shell中的date

在处理数据时经常需要根据时间段批量回溯数据,因此在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

 

  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值