época do Unix em milissegundos

5

Estou prefixando a época do Unix com precisão "nanossegundo" na saída do meu comando, conforme abaixo:

$ command | while read line; do d='date +%s%N'; echo $d $line; done > file

Eu olhei em volta para descobrir como transformar "nanossegundo" em "milissegundo". Por exemplo, eu segui a solução dada aqui . Então, tentei as duas abordagens sugeridas:

$ command | while read line; do d='echo $(($(date +%s%N)/1000000))'; echo $d $line; done > file
$ command | while read line; do d='date +%s%N | cut -b1-13'; echo $d $line; done > file

No entanto, em ambos os casos, quando insiro o arquivo no InfluxDB e consulta meu banco de dados, recebo isso:

time    
1970-01-01T00:24:05.419982325Z  
1970-01-01T00:24:05.419982344Z  
1970-01-01T00:24:05.419982371Z  
1970-01-01T00:24:05.419982378Z  
1970-01-01T00:24:05.419982388Z  
1970-01-01T00:24:05.419982401Z

Atualizar

Quando eu uso epoch com precisão de nanossegundo date +%s%N , eu entendo:

time
2015-10-21T08:59:59.978902683Z  
2015-10-21T08:59:59.982615836Z  
2015-10-21T08:59:59.983958069Z  
2015-10-21T08:59:59.98805317Z   
2015-10-21T08:59:59.99717678Z   
2015-10-21T09:00:00.028624495Z  

Estou esperando uma saída como essa:

2015-10-21T09:12:10.001327Z

Por favor, deixe-me saber se você tem alguma solução.

    
por encodeflush 21.10.2015 / 11:48

3 respostas

6

Você pode usar bc e printf :

printf "%0.f" "$(bc <<<"$(date +"%s.%N")*1000")"

Isso dá o número de milissegundos desde janeiro de 1970. Eu não usei a opção scale=n de bc de propósito, porque isso não arredondaria o valor, em vez disso, ele corta o resto (eu sei, é pedante ). bc lê do arquivo ou da entrada padrão. <<< é uma string que expande o conteúdo e os fornece como entrada padrão para bc . Isso é dado a printf para arredondar o valor.

Veja isso como um exemplo:

$ 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

No loop, ficaria assim:

command | while read line; do
  d=$(printf "%0.f" "$(bc <<<"$(date +"%s.%N")*1000")")
  echo "$d $line"
done >file
    
por 21.10.2015 / 12:19
2

Você quase acertou, apenas um par de carrapatos em excesso

$ d=$(($(date +%s%N)/1000000))
$ echo $d
1445422618527
$ d=$(date +%s%N)
$ echo $d $(( d / 10 )) $(( d / 1000000 ))
1445422673712321597 144542267371232159 1445422673712
    
por 21.10.2015 / 12:35
1

nano é 10 −9 e milli 10 −3 . Assim, podemos usar os 3 primeiros caracteres de nanossegundos para obter o milli:

date +%s%3N

De man date :

%N nanoseconds (000000000..999999999)

%s seconds since 1970-01-01 00:00:00 UTC

Fonte: Como posso obter o tempo atual do Unix em milissegundos usando o bash? . Note que publiquei esta mesma resposta na pergunta igual do Stack Overflow para obter o tempo em milissegundos .

    
por 21.10.2015 / 15:15