我的文件位于以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 应该参与其中,但也许 find -exec,但一个简单的 grep+cat 甚至是树,但是。 ..
有什么帮助吗?
提前致谢
答案1
仅使用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
) 选项添加到最后jq
,以生成紧凑的输出,例如
[{"ID":"28-00000cbece90","temp":21.812},{"ID":"28-00000cbece91","temp":21.812}]