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
答案 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中工作,如果这是你需要的。