舍入到最近的5分钟

时间:2012-03-15 10:40:10

标签: shell date sed awk grep

date命令返回当前日期。我想要最近的5分钟间隔。例如,

# date
Thu Mar 15 16:06:42 IST 2012

在这种情况下,我想返回......

Mar 15 16:05:00 

是否可以在shell脚本中使用?或者是否有任何一个班轮?

更新

日期采用这种格式......

2012-03-10 12:59:59

最新更新:

以下命令按预期工作。谢谢你的回复。

head r_SERVER_2012-03-10-12-55-00 | awk -F'^' '{print $7}' |  awk '{split($2, a, ":"); printf "%s %s:%02d:00\n", $1, a[1],int(a[2]/5)*5}'

正确的结果:

2012-03-10 12:55:00

但我想显示除日期以外的其他字段。以下不起作用:

head r_SERVER_2012-03-10-12-55-00 | awk -F'^' '{print $1, $2, $7, $8}' |  awk '{split($2, a, ":"); printf "%s %s:%02d:00\n", $1, a[1],int(a[2]/5)*5}'

错误的结果:

565 14718:00:00

应该是......

565 123 2012-03-10 12:55:00 country

3 个答案:

答案 0 :(得分:2)

date | awk '{split($4, a, ":"); printf "%s %s %s:%02d:00", $2, $3, a[1],int(a[2]/5)*5}'

答案 1 :(得分:2)

$ date="2012-03-10 12:59:59"
$ read d h m s < <(IFS=:; echo $date)
$ printf -v var "%s %s:%d:00" $d $h $(( m-(m%5) ))
$ echo "$var"
2012-03-10 12:55:00

我在read命令中使用进程替换来隔离子shell中对IFS的更改。 `

答案 2 :(得分:1)

如果您有GNU AWK,可以使用:

| gawk '{t=mktime(gensub(/[-:]/," ","g")); print strftime("%Y-%m-%d %H:%M:%S",int(t/5)*5);}'

这使用int()函数,它截断,这意味着“向下舍入”。如果您决定“更圆”(即转到“最近的”5秒增量),请将int(t/5)替换为int((t+2.5)/5)

当然,如果你感觉自虐,你可以用纯贝壳做到这一点。这个只是截断而不是四舍五入。

[ghoti@pc ~]$ fmt="%Y-%m-%d %H:%M:%S"  
[ghoti@pc ~]$ date "+$fmt"
2012-03-15 07:53:37
[ghoti@pc ~]$ date "+$fmt" | while read date; do stamp="`date -jf \"$fmt\" \"$date\" '+%s'`"; date -r `dc -e "$stamp 5/ 5* p"` "+$fmt"; done
2012-03-15 07:53:35

请注意,我正在使用FreeBSD。如果您使用的是Linux,那么您可能需要为date命令使用不同的选项(特别是我认为的-r和-f选项)。我在bash中运行它,但它应该在纯Bourne shell中工作,如果这是你需要的。