如何用jq将LSF调度器的作业数据汇总为主机状态统计表?
仅用bjobs和jq实现主机-作业状态汇总统计
完全可行,以下是直接用bjobs结合jq完成分组统计并输出表格的方案,无需依赖datamash:
场景1:单主机作业(EXEC_HOST为单个主机名)
执行以下命令即可生成格式化的汇总表格:
bjobs -q normal -a -uall -o 'exec_host stat' -json | jq ' .RECORDS | group_by(.EXEC_HOST) | map({ host: .[0].EXEC_HOST, stats: ( group_by(.STAT) | map({key: .[0].STAT, value: length}) | from_entries ) }) | (["主机名"] + (map(.stats | keys) | add | unique)) as $headers | $headers, (map( [.host] + ($headers[1:] | map(.stats[.] // 0)) )) | @tsv ' | column -t -s $'\t'
命令拆解:
- 提取作业数据:
.RECORDS直接定位到bjobs输出的作业记录数组 - 按主机分组:
group_by(.EXEC_HOST)将同一主机的作业归为一组 - 统计各状态数量:对每个主机组内的作业按
STAT再次分组,用length统计每组数量,转成键值对格式 - 构建表头:收集所有出现过的作业状态作为表头列,加上"主机名"
- 生成表格行:将每个主机的统计数据对应到表头列,未出现的状态填0
- 格式化输出:用
@tsv转成制表符分隔格式,再通过column命令对齐成美观的表格
场景2:多主机作业(EXEC_HOST包含多个主机,如hostA hostB)
如果存在作业分配到多台主机的情况,需要先拆分主机名再统计,命令调整为:
bjobs -q normal -a -uall -o 'exec_host stat' -json | jq ' .RECORDS | map(.EXEC_HOST | split(" ")[] as $host | {host: $host, stat: .STAT}) | group_by(.host) | map({ host: .[0].host, stats: ( group_by(.stat) | map({key: .[0].stat, value: length}) | from_entries ) }) | (["主机名"] + (map(.stats | keys) | add | unique)) as $headers | $headers, (map( [.host] + ($headers[1:] | map(.stats[.] // 0)) )) | @tsv ' | column -t -s $'\t'
新增的map(.EXEC_HOST | split(" ")[] as $host | {host: $host, stat: .STAT})步骤会把多主机的作业拆分成单主机条目,再按上述逻辑统计。
内容的提问来源于stack exchange,提问作者srh
相关产品推荐
相关产品推荐

