我对 shell 脚本和 jq 工具创建带有时间戳的 json 文件有疑问。
echo "{\"vtg\":[$value]}" | jq -a '. + {date: now|strflocaltime("%r")}' > sample.json
通过这个命令,我得到了下面的 json 文件。
{
"vtg": [
11.769,
11.769,
11.339,
11.788,
11.867,
11.886,
11.808,
11.339,
11.554,
11.182
],
"date": "03:31:52 PM"
}
但我想要时间戳,
"date": [
15,
31,
52
]
什么时候
strptime("%H:%M:%SZ")
我应该以我想要的格式获得时间戳。但它给了我错误:
jq: error (at <stdin>:10): strptime/1 requires string inputs and arguments
有人可以帮我如何获取 JSON 文件中的时间戳吗?
答案1
该strptime()
函数用于解析格式化的时间(与它相反strftime()
)。你要strftime()
。
使用jq
:
jq -n 'now as $t | { date: [ ($t|strftime("%H")), ($t|strftime("%M")), ($t|strftime("%S")) ] }'
这用于strftime()
格式化函数给出的时间now
。用于strflocaltime()
将时间转换为当地时间。
如果这太冗长或看起来效率低下(我们实际上strftime()
为数组的每个元素调用一次date
!),那么考虑创建一个HH:MM:SS
时间戳细绳,然后将其拆分为冒号:
jq -n '{ date: (now | strftime("%H:%M:%S") | split(":")) }'
上述任一命令都可能产生
{
"date": [
"07",
"01",
"23"
]
}
完整脚本(用于根据命名数组的值jo
安全地创建初始数组):vtg
bash
#!/bin/bash
value=(11.769 11.769 11.339 11.788 11.867 11.886 11.808 11.339 11.554 11.182)
jo vtg="$( jo -a "${value[@]}" )" |
jq '. += now as $t | { date: [ ($t|strftime("%H")), ($t|strftime("%M")), ($t|strftime("%S")) ] }'
# or...
jo vtg="$( jo -a "${value[@]}" )" |
jq '. += { date: (now | strftime("%H:%M:%S") | split(":")) }'
jo
显然,您还可以通过从命令读取来动态创建数据的日期部分date
:
jo vtg="$( jo -a "${value[@]}" )" \
date="$( jo -a $( date +'%H %M %S' ) )"
这依赖于 shell 将输出从date
格式字符串中的空格分开。您将从上面获得当地时间。
该jo
工具可从https://jpmens.net/2016/03/05/a-shell-command-to-create-json-jo/