如何使用 jq 工具在 JSON 文件中的 shell 脚本中获取标记?

如何使用 jq 工具在 JSON 文件中的 shell 脚本中获取标记?

我对 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安全地创建初始数组):vtgbash

#!/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/

相关内容