以下のようにコマンド出力に「ナノ秒」精度のUnix時代を追加しました。
$ command | while read line; do d=`date +%s%N`; echo $d $line; done > file
「ナノ秒」を「ミリ秒」に変換する方法を探してみました。たとえば、私は与えられた解決策に従いました。ここ。だから私は提案された2つのアプローチを試しました。
$ 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
ため、意図的にこのオプションを使用しませんでした(これは賢明であることがわかります)。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
答え2
ナノメートルは10 -9、ミリメートルは10 -3です。したがって、ナノ秒の最初の3文字を使用してミリ秒を取得できます。
date +%s%3N
からman date
:
%N ナノ秒(000000000..999999999)
%S 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