在Conky中使用awk while循环处理多段BOINC任务数据的问题
解决Conky中Boinccmd多任务数据提取的自适应方案
问题场景
需要在Conky脚本中解析boinccmd --get_tasks的输出,提取每段任务的WU name、project URL、estimated CPU time remaining和fraction done字段并格式化输出。现有代码只能处理单段任务,需重复编写n次代码适配不同线程数,无法自适应任务数量。
解决方案
利用Awk的分段触发逻辑,以任务段的分隔线(如1) -----------)为节点,每遇到新任务段就输出上一段的收集结果,再重置变量收集当前段数据,实现自适应多任务解析。
Conky脚本代码
${execi 60 boinccmd --get_tasks | awk -F': |://|/' '\ # 匹配新任务段分隔线,输出上一段数据并重置变量 /^[0-9]+) -----------/ { if (u != "" && w != "" && p != "" && e != "") { printf "%.10s %.18s %3.1f %s\n", u, w, p*100, e } u = w = p = e = "" next } # 提取项目URL的域名部分 /project URL/ { u = $3 } # 提取WU名称 /WU name/ { w = $2 } # 提取完成进度比例 /fraction done/ { p = $2 } # 计算并格式化剩余时间 /estimated CPU time remaining/ { e = strftime("%d/%m %Hh%M", $2 + systime()) } # 输出最后一段任务数据 END { if (u != "" && w != "" && p != "" && e != "") { printf "%.10s %.18s %3.1f %s\n", u, w, p*100, e } }\ '}
代码说明
- 分段触发逻辑:通过匹配
^[0-9]+) -----------识别新任务段,若已收集到上一段完整数据则先格式化输出,再清空变量准备收集当前段。 - 字段提取:沿用原分隔规则提取对应字段:
- 项目URL分割后取第3段(域名部分)
- WU名称取分割后的第2段
- 完成比例直接取数值部分,后续转成百分比
- 剩余时间将秒数加到当前系统时间上,格式化为
日/月 时h分
- 收尾处理:在
END块中输出最后一段任务数据,避免遗漏。
输入输出示例
- 输入(
boinccmd --get_tasks输出片段):
1) ----------- name: wu_1664392603_228876_0 WU name: wu_1664392603_228876 project URL: https://boinc.loda-lang.org/loda/ fraction done: 0.809 estimated CPU time remaining: 3600 ... 2) ----------- name: wu_1664392603_228908_0 WU name: wu_1664392603_228908 project URL: https://boinc.loda-lang.org/loda/ fraction done: 0.807 estimated CPU time remaining: 7200 ...
- 输出(Conky中显示的格式化内容):
boinc.loda wu_1664392603_2288 80.9 07/10 01h37 boinc.loda wu_1664392603_2289 80.7 07/10 02h38
内容的提问来源于stack exchange,提问作者Guillaume J.
相关产品推荐
相关产品推荐

