web-dev-qa-db-ja.com

ミリ秒単位のUnixエポック

以下のように、コマンドの出力に「ナノ秒」の精度でUnixエポックを付加します。

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

「ナノ秒」を「ミリ秒」に変換する方法を探して周りを見回しました。たとえば、私は here という解決策に従いました。だから、私は両方の提案されたアプローチを試しました:

$ 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

更新

エポックをナノ秒の精度で使用する場合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

解決策があれば教えてください。

5
encodeflush

bcprintfを使用できます。

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

これは、1970年1月からのミリ秒数を示します。bcscale=nオプションを意図的に使用しませんでした。これは、値を丸めないので、残りを切り捨てるからです(わかっています。 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
6
chaos

あなたはほぼそれを正しく持っていました、ほんの数回のバックティックが多すぎます

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

ナノは10です−9 とミリ10−3。したがって、ナノ秒の最初の3文字を使用してミリを取得できます。

date +%s%3N

man dateから:

%Nナノ秒(000000000..999999999)

%s1970-01-01 00:00:00 UTCからの秒数

出典:サーバー障害 bashを使用して現在のUnix時間をミリ秒単位で取得するにはどうすればよいですか? 。 Stack Overflowの同等の質問にこれと同じ回答を投稿したことに注意してください ミリ秒単位で時間を取得するLinuxコマンド

1
fedorqui