如何使用工具或命令将wmctrl输出转换为指定JSON格式?
将wmctrl输出转换为指定JSON格式的工具/命令方法
我们需要把wmctrl -l -i -p的输出转换成目标JSON结构,先明确输入输出:
原始输入(wmctrl输出)
0x01000003 -1 3208 user xfce4-panel
0x01400013 -1 3217 user Desktop
0x00e00615 0 3212 user shared - Thunar
0x0540011b 2 5263 user Firefox Developer Edition
0x00e8421b 2 3212 user scripts - Thunar
目标输出(JSON格式)
[ { "windowId": "0x01000003", "desktop": -1, "windowsPid": 3208, "label": "xfce4-panel" }, { "windowId": "0x01400013", "desktop": -1, "windowsPid": 3217, "label": "Desktop" }, { "windowId": "0x00e00615", "desktop": 0, "windowsPid": 3212, "label": "shared - Thunar" }, { "windowId": "0x0540011b", "desktop": 2, "windowsPid": 5263, "label": "Firefox Developer Edition" }, { "windowId": "0x00e8421b", "desktop": 2, "windowsPid": 3212, "label": "scripts - Thunar" } ]
以下是几种可行的实现方式:
方法1:awk + jq 命令行组合
这是最便捷的终端方案,awk负责字段提取和JSON片段生成,jq负责格式整理:
wmctrl -l -i -p | awk '{ printf "{\"windowId\":\"%s\",\"desktop\":%s,\"windowsPid\":%s,\"label\":\"", $1, $2, $3; for(i=5; i<=NF; i++) printf "%s ", $i; printf "\"}\n" }' | jq -s '.'
- 逻辑说明:awk提取前3列作为
windowId/desktop/windowsPid,从第5列开始拼接label(跳过第4列的用户名);jq的-s参数将所有单行JSON对象合并为数组并格式化。
方法2:Python 脚本处理
适合熟悉Python的场景,逻辑更直观:
创建脚本文件wmctrl2json.py:
import subprocess import json # 执行wmctrl命令并获取输出 output_lines = subprocess.check_output(["wmctrl", "-l", "-i", "-p"]).decode().splitlines() result_list = [] for line in output_lines: # 按空格分割,最多分割4次,确保label字段完整保留 parts = line.strip().split(maxsplit=4) if len(parts) >= 5: window_id, desktop_str, pid_str, _, label = parts result_list.append({ "windowId": window_id, "desktop": int(desktop_str), "windowsPid": int(pid_str), "label": label.strip() }) # 输出格式化后的JSON print(json.dumps(result_list, indent=4))
运行脚本:
python3 wmctrl2json.py
方法3:sed + jq 命令行组合
用正则替换实现字段提取,再通过jq整理格式:
wmctrl -l -i -p | sed -E 's/^([^ ]+) +(-?[0-9]+) +([0-9]+) +[^ ]+ +(.*)$/{"windowId":"\1","desktop":\2,"windowsPid":\3,"label":"\4"}/' | jq -s '.'
- 逻辑说明:sed通过正则捕获每行的目标字段,直接替换为JSON对象格式;jq完成数组合并和格式化。
内容的提问来源于stack exchange,提问作者bitbar
相关产品推荐
相关产品推荐

