使用bash脚本以每小时循环打印日期

时间:2012-07-20 07:03:29

标签: bash date ubuntu

我想写一个bash脚本,用以下格式打印出日期:

20120205_16
(year)(month)(day)_(24 hour)

所以当前日期的命令是:

date +'20%y%m%d_%H'

我想要做的是从指定日期到另一个日期打印这样的日期(使用for循环或其他东西)。例如:

20120205_16 -> 20120305_18 would be:

20120205_16
20120205_17
20120205_18
...
20120305_17
20120305_18

显然,这里的两个硬位是指定日期并按小时递增。

是否可以使用日期或其他方法轻松完成此操作?

3 个答案:

答案 0 :(得分:5)

首先,您使用time_t格式获取%s值:

start=$(date --date '5 feb 2012 16:00' +%s)
stop=$(date --date '5 mar 2012 18:00' +%s)

这些以秒表示。您可以对其值使用for循环,将它们增加1小时(3600秒):

for t in $(seq ${start} 3600 ${stop})
do
    date --date @${t} +'%Y%m%d_%H'
done

请注意@,用于表示%+s参数中--date获得的时间。

答案 1 :(得分:1)

我已经编写了一套用于日常摆弄的命令行工具(dateutils)。它绝对不是广泛传播,而是便携式。

对于这类任务,dseq是你的朋友,你的例子归结为:

dseq '2012-02-05 16:00:00' 1h '2012-03-05 18:00:00' -f '%Y%m%d_%H'
=>
20120205_16
20120205_17
20120205_18
  ...
20120305_16
20120305_17
20120305_18

答案 2 :(得分:1)

这也可以在Gawk中很好地完成:

gawk -v start="2011 10 10  10 00 00" \
     -v end="2011 11 10  10 00 00" '

BEGIN {
  time = mktime( start )
  end = mktime( end )
  while ( time <= end ) {
    print strftime( "%Y%m%d_%H", time )
    time +=3600
  }
}'