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

如何使用工具或命令将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 23:42:38