Вы можете использовать bc
и printf
:
printf "%0.f" "$(bc <<<"$(date +"%s.%N")*1000")"
Это дает количество миллисекунд с января 1970 года. Я специально не использовал опцию scale = n
в bc
, потому что это не округляет значение, а убирает все остальное (я знаю, это педантично). bc читает из файла или со стандартного ввода. <<<
- это здесь строка , которая расширяет содержимое и предоставляет его в качестве стандартного ввода для bc
. Он передается в printf
для округления значения.
Рассмотрите это как пример:
$ d=$(date "+%s.%N")
$ echo $d; bc <<<"scale=0; ($d*1000)/1"; printf "%0.f" "$(bc <<<"$d*1000")"
1445423229.512731661 # plain date
1445423229512 # bc with scale
1445423229513 # bc/printf
Тогда в цикле это будет выглядеть так:
command | while read line; do
d=$(printf "%0.f" "$(bc <<<"$(date +"%s.%N")*1000")")
echo "$d $line"
done >file
Вы почти все сделали правильно, всего пара обратных тиков слишком много
$ d=$(($(date +%s%N)/1000000))
$ echo $d
1445422618527
$ d=$(date +%s%N)
$ echo $d $(( d / 10 )) $(( d / 1000000 ))
1445422673712321597 144542267371232159 1445422673712
нано равно 10 -9 и милли 10 -3 . Следовательно, мы можем использовать 3 первых символа наносекунды для получения милли:
date +%s%3N
From man date
:
% N наносекунд (000000000..999999999)
% s секунд с 1970-01-01 00:00:00 UTC
Источник: Ошибка сервера Как мне получить текущее время Unix в миллисекундах с помощью bash? . Обратите внимание, что я разместил этот же ответ в вопросе Stack Overflow Linux, чтобы получить время в миллисекундах .