我将具有“纳秒”精度的 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
,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