如何从boinccmd输出中提取并关联name与fraction done字段
解决方案:用awk关联任务的name与fraction done字段
可以通过awk处理boinccmd --get_tasks的输出,利用变量保存上下文状态,实现同一任务的两个字段关联输出,同时自动过滤不含fraction done的任务:
boinccmd --get_tasks | awk ' /^name: / { # 若存在未匹配到fraction done的旧任务名,直接丢弃 if (current_name != "") current_name = "" # 提取并保存当前任务名(跳过"name: "前缀) current_name = substr($0, 7) next } /^fraction done: / { # 仅当有已保存的任务名时,才输出关联结果 if (current_name != "") { printf "%s\t%s\n", current_name, substr($0, 16) # 输出后清空变量,准备处理下一个任务 current_name = "" } next } '
逻辑说明
- 匹配以
name:开头的行时,保存当前任务名到变量current_name;如果之前有未找到对应fraction done的任务名,直接清空,避免残留无效数据。 - 匹配以
fraction done:开头的行时,检查是否有已保存的任务名:- 若有,则将任务名与进度值按行输出(用制表符分隔,可根据需求换成空格或其他分隔符)
- 输出后清空
current_name,确保不会和下一个任务的字段混淆
- 所有非目标行直接忽略,不影响处理流程
替代方案(sed+awk组合)
如果偏好分步骤处理,也可以先将每个任务的块合并为单行,再提取字段,但awk单命令的方式更高效:
boinccmd --get_tasks | sed -e '/^name:/{:a;N;/fraction done:/!ba;s/\n/ /g}' | awk '/fraction done:/ {print $2, $NF}'
这个方法先将包含name和fraction done的任务块合并为一行,再提取对应字段,但对输出格式的一致性要求更高。
内容的提问来源于stack exchange,提问作者WesZ
相关产品推荐
相关产品推荐

