獲取子文件夾中同名文件的內容,獲取JSON數組
我在以 . 開頭的文件夾中有文件
28-
。它們是用於測量溫度的單線匯流排感測器。Raspberry 通過其 SPI 介面辨識它們;每個探針都有其 ID(以 28- 開頭),RB 為每個感測器創建一個樹,命名為探針 ID,例如
ls /sys/bus/w1/devices/w1_bus_master1 -1 28-00000cbece94/ 28-00000cbeeca3/ 28-00000cbeedf6/ 28-00000cbf87ba/ ...
文件夾內有兩個文件(以及許多其他文件),它們是
temperature
和name
.
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}]