Unix 에포크(밀리초)

Unix 에포크(밀리초)

다음과 같이 명령 출력에 "나노초" 정밀도의 Unix 시대를 추가했습니다.

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

"나노초"를 "밀리초"로 변환하는 방법을 찾아보았습니다. 예를 들어, 나는 주어진 해결책을 따랐습니다.여기. 그래서 저는 제안된 두 가지 접근 방식을 시도했습니다.

$ 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

그러나 두 경우 모두 InfluxDB에 파일을 삽입하고 데이터베이스를 쿼리하면 다음과 같은 결과가 나타납니다.

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

고쳐 쓰다

나노초 정밀도로 epoch를 사용하면 date +%s%N다음과 같은 결과를 얻습니다.

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  

나는 다음과 같은 결과를 기대하고 있습니다 :

2015-10-21T09:12:10.001327Z

해결책이 있으면 알려주시기 바랍니다.

답변1

bc다음 을 사용할 수 있습니다 printf.

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

이는 1970년 1월 이후의 밀리초 수를 제공합니다. 이 옵션은 값을 반올림하지 않고 나머지 부분을 자르기 scale=n때문에 의도적으로 이 옵션을 사용하지 않았습니다 (이것은 현학적이라는 것을 알고 있습니다). bcbc는 파일이나 표준 입력에서 읽습니다. <<<여기에 있는 문자열내용을 확장하고 표준 입력으로 제공합니다 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

답변2

나노미터는 10 -9 이고 밀리미터는 10 -3 입니다 . 따라서 나노초의 처음 3자를 사용하여 밀리초를 얻을 수 있습니다.

date +%s%3N

에서 man date:

%N 나노초(000000000..999999999)

%에스 1970-01-01 00:00:00 UTC 이후의 초 수

출처: 서버 장애bash를 사용하여 현재 Unix 시간을 밀리초 단위로 얻는 방법은 무엇입니까?. Stack Overflow의 동일한 질문에 동일한 답변을 게시했습니다.밀리초 단위로 시간을 가져오는 Linux 명령.

답변3

후크 몇 개만 더 추가하면 거의 맞다고 생각하셨을 겁니다

$ d=$(($(date +%s%N)/1000000))
$ echo $d
1445422618527
$ d=$(date +%s%N)
$ echo $d $(( d / 10 )) $(( d / 1000000 ))
1445422673712321597 144542267371232159 1445422673712

관련 정보