如何使用 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/

相關內容