You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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)

步骤解释

  1. add:合并sensors和lscpu输出的两个JSON对象。
  2. 提取温度映射:从coretemp-isa-0000中筛选Core X格式的键,提取核心ID并转为数字,同时取出对应温度值并取整,最终整理为{核心ID: 温度}的映射对象。
  3. 遍历cpus数组:对每个CPU条目,取出编号、取整后的频率,通过核心ID从温度映射中匹配对应温度,按要求格式拼接成字符串。
  4. -r参数:让jq输出原始字符串而非JSON格式。

执行后输出

0 2997 32
1 3191 22
2 2948 31
3 1600 28

内容的提问来源于stack exchange,提问作者daPeach

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 16:26:05