Json

獲取子文件夾中同名文件的內容,獲取JSON數組

  • April 24, 2021

我在以 . 開頭的文件夾中有文件28-

它們是用於測量溫度的單線匯流排感測器。Raspberry 通過其 SPI 介面辨識它們;每個探針都有其 ID(以 28- 開頭),RB 為每個感測器創建一個樹,命名為探針 ID,例如

ls /sys/bus/w1/devices/w1_bus_master1 -1
28-00000cbece94/
28-00000cbeeca3/
28-00000cbeedf6/
28-00000cbf87ba/
...

文件夾內有兩個文件(以及許多其他文件),它們是temperaturename.

name是探針 ID,也是文件夾名稱;temperature是(……驚喜)溫度。

其中 ID 是文件夾名稱和文件內容:

cat /sys/bus/w1/devices/w1_bus_master1/28-00000cc002fa/name 
28-00000cc002fa

溫度是

cat /sys/bus/w1/devices/w1_bus_master1/28-00000cc002fa/temperature 
21812

我想編寫一個腳本或編寫一系列 bash 命令,最終產生一個 JSON 對像數組,例如: [ {"ID": "28-00000cbece94", "temp": 24.712}, {"ID": "28-00000cbeeca3", "temp": 24.735}, <so on> ] 我認為應該涉及 awk,但也許可以找到 -exec,但是一個簡單的 grep+cat 甚至是樹,但是。 ..

有什麼幫助嗎?

提前致謝

僅使用jq(兩次)和一個 shell 循環:

for pathname in /sys/bus/w1/devices/w1_bus_master1/28-*/; do
   jq -n \
       --arg ID "$(basename "$pathname")" \
       --arg temp "$(cat "$pathname"/temperature)" \
       '{ ID: $ID, temp: $temp }'
done |
jq -s '. | map( .temp = (.temp | tonumber / 1000) )'

該循環遍歷與28-您在問題中提到的目錄對應的路徑名。該循環用於jq為每個目錄創建一個 JSON 對象,由一個ID元素和一個temp元素組成。的值ID將只是目錄路徑名的基本名稱,溫度是從temperature目錄中的文件中讀取的。

然後將這些單獨的 JSON 對象通過管道傳送到第二個程序,該程序使用( ) 選項jq創建它們的數組。它還通過將每個對象的元素從字元串轉換為數字並將其除以 1000 來修改每個對象的元素(這是您從未說過的,所以我猜)。-s``--slurp``temp

jo同樣的事情,但在循環中使用了稍微方便的實用程序:

for pathname in /sys/bus/w1/devices/w1_bus_master1/28-*/; do
   jo  ID="$(basename "$pathname")" \
       temp="$(cat "$pathname"/temperature)"
done |
jq -s '. | map( .temp /= 1000 )'

jo實用程序還檢測到這temp是一個數字,因此我們以後不必從字元串中轉換它們。

這兩個循環都會創建像“漂亮列印”的 JSON

[
 {
   "ID": "28-00000cbece90",
   "temp": 21.812
 },
 {
   "ID": "28-00000cbece91",
   "temp": 21.812
 }
]

-c( --compact-output) 選項添加到 finaljq以生成緊湊的輸出,例如

[{"ID":"28-00000cbece90","temp":21.812},{"ID":"28-00000cbece91","temp":21.812}]

引用自:https://unix.stackexchange.com/questions/646556