使用bash+jq整合lscpu与sensors数据:输出格式异常求助
问题
在bash环境中用jq整合sensors和lscpu的输出,已得到包含核心温度与CPU频率的JSON数据,但需要输出「CPU编号 频率 温度」的纯文本格式。现有jq脚本仅在每个核心下生成cpus数组,未正确修改目标cpus数组,无法得到期望结果。
执行命令
jq -s 'add' \ <(LC_NUMERIC=C sensors -j coretemp-isa-0000) \ <(LC_NUMERIC=C lscpu -J -e=cpu,mhz)
当前输出结果
{"coretemp-isa-0000":{"Adapter":"ISA adapter","Package id 0":{"temp1_input":32.000,"temp1_max":80.000,"temp1_crit":99.000,"temp1_crit_alarm":0.000},"Core 0":{"temp2_input":32.000,"temp2_max":80.000,"temp2_crit":99.000,"temp2_crit_alarm":0.000},"Core 1":{"temp3_input":22.000,"temp3_max":80.000,"temp3_crit":99.000,"temp3_crit_alarm":0.000},"Core 2":{"temp4_input":31.000,"temp4_max":80.000,"temp4_crit":99.000,"temp4_crit_alarm":0.000},"Core 3":{"temp5_input":28.000,"temp5_max":80.000,"temp5_crit":99.000,"temp5_crit_alarm":0.000}},"cpus":[{"cpu":0,"mhz":2997.8560},{"cpu":1,"mhz":3191.4871},{"cpu":2,"mhz":2948.6250},{"cpu":3,"mhz":1600.0000}]}
期望输出结果
0 2997 32 1 3191 22 2 2948 31 3 1600 28
尝试的脚本
#!/bin/bash filtre='add |(.["coretemp-isa-0000"] |keys[] as $core |select($core|test("^Core [0-9]$")) |($core|ltrimstr("Core ")) as $id |.[$core] |keys[] as $temp |select($temp|test("temp[0-9]_input")) |.cpus[$id|tonumber] += {"temp":.[$temp]}),.cpus' jq -rs "$filtre" \ <(LC_NUMERIC=C sensors -j coretemp-isa-0000) \ <(LC_NUMERIC=C lscpu -J -e=cpu,mhz)
解决方案
之前的脚本问题在于试图直接修改原对象的cpus数组,但jq的管道操作会生成新对象而非修改原结构。正确做法是先把温度数据提取为核心ID映射,再遍历cpus数组匹配对应数据,最后格式化输出。
正确执行命令
jq -r ' add | # 提取温度映射:核心ID -> 取整后的温度 (.["coretemp-isa-0000"] | [keys[] | select(test("^Core \\d+$")) | { id: (ltrimstr("Core ") | tonumber), temp: (.[.] | to_entries[] | select(.key | test("temp\\d+_input")) | .value | floor) }] | from_entries) as $temp_map | # 遍历cpus数组,拼接成目标格式字符串 .cpus[] | "\(.cpu) \(.mhz | floor) \($temp_map[.cpu].temp)" ' <(LC_NUMERIC=C sensors -j coretemp-isa-0000) <(LC_NUMERIC=C lscpu -J -e=cpu,mhz)
步骤解释
add:合并sensors和lscpu输出的两个JSON对象。- 提取温度映射:从
coretemp-isa-0000中筛选Core X格式的键,提取核心ID并转为数字,同时取出对应温度值并取整,最终整理为{核心ID: 温度}的映射对象。 - 遍历cpus数组:对每个CPU条目,取出编号、取整后的频率,通过核心ID从温度映射中匹配对应温度,按要求格式拼接成字符串。
-r参数:让jq输出原始字符串而非JSON格式。
执行后输出
0 2997 32 1 3191 22 2 2948 31 3 1600 28
内容的提问来源于stack exchange,提问作者daPeach
相关产品推荐
相关产品推荐

