2012-03-15 6 views
0

Команда date возвращает текущую дату. Мне нужен ближайший 5-минутный интервал. Напр.Раунд до ближайших 5 минут

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

В этом случае я хочу вернуться ...

Mar 15 16:05:00 

Можно ли в сценарии оболочки? или есть ли для этого один вкладыш?

Update:

дата в этом формате ...

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

Просто для удовольствия, в PowerShell:' Get-Date ((([long] ((Get-Date '2012-03-10 12:59:59'). Ticks/3e9)) * [ долго] 3e9)) '. – Joey

+0

Прекратите добавлять к вашему вопросу больше. Я думаю, вы хотели спросить об этом в чате, видя, как вам кажется, что вы хотите обсудить это. –

ответ

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

Фактически дата в этом формате ... «2012-03-10 12:59:59». Формат, данный в вопросе, был всего лишь примером. – shantanuo

+0

echo "2012-03-10 12:59:59" | awk '{split ($ 2, a, ":"); printf "% s% s:% 02d: 00", $ 1, a [1], int (a [2]/5) * 5} ' – spicavigo

+0

Как ни крути, это не округляет вещи до следующего день. '2012-03-10 23: 59: 59' должен быть округлен до' 2012-03-11 00: 00; 00'. – ghoti

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).

Конечно, если вы чувствуете мазохистство, вы можете сделать это в чистой оболочке. Этот только усекает, а не округляет.

[[email protected] ~]$ fmt="%Y-%m-%d %H:%M:%S" 
[[email protected] ~]$ date "+$fmt" 
2012-03-15 07:53:37 
[[email protected] ~]$ 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, если это то, что вам нужно.

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, чтобы изолировать изменения IFS в подоболочке. `

Смежные вопросы