开发工具【免费下载链接】jcCLI tool and python library that converts the output of popular command-line tools, file-types, and common strings to JSON, YAML, or Dictionaries. This allows piping of output to tools like jq and simplifying automation scripts.项目地址https://gitcode.com/gh_mirrors/jc/jc点击查看免费下载导读ps是 Linux、macOS 等系统上最常用的进程查看命令但其纯文本表格输出难以直接供脚本、jq 与监控系统消费。本文讲解 jc 项目JSON ConvertCLI 工具兼 Python 库中内置的ps解析器它能把ps -ef与ps axu两种主流输出格式转换为结构化的 JSON / YAML / Python 字典并保留原始字段语义。读完本文你将掌握ps解析器的命令行用法、Python 模块调用方式、输出 Schema 与字段类型约定以及其底层基于通用表格解析的源码实现原理。解析器概览与支持范围ps解析器对应源码 jc/parsers/ps.py是 jc 众多命令解析器中的一员专门处理ps命令的文本输出。根据 解析器文档 与源码 docstring它支持两种ps选项组合ps选项输出风格字段特征-efBSD 全格式含UID / PID / PPID / C / STIME / TTY / TIME / CMDaxu面向所有用户的详细格式含USER / PID / %CPU / %MEM / VSZ / RSS / TTY / STAT / START / TIME / COMMAND解析器元信息见 jc/parsers/ps.py 的info类声明了版本、作者与兼容平台版本1.7作者 Kelly Brazil兼容平台linux、darwin、cygwin、aix、freebsd标签command对应魔法命令ps也就是说在 Linux 服务器、macOS、FreeBSD、AIX 以及 Cygwin 环境下抓取的ps -ef或ps axu输出都可以交给该解析器处理。jc 在解析前会通过jc.utils.compatibility()做平台兼容性检查在不兼容平台或未知输出上解析时可能给出警告提示可用quiet参数抑制。命令行用法通过管道转换最常用的方式是把ps的输出直接管道给 jc$ ps -ef | jc --ps -p[ { uid: root, pid: 1, ppid: 0, c: 0, stime: Nov01, tty: null, time: 00:00:11, cmd: /usr/lib/systemd/systemd --switched-root --system --dese... }, { uid: root, pid: 2, ppid: 0, c: 0, stime: Nov01, tty: null, time: 00:00:00, cmd: [kthreadd] }, { uid: root, pid: 4, ppid: 2, c: 0, stime: Nov01, tty: null, time: 00:00:00, cmd: [kworker/0:0H] } ]-p表示美化打印pretty printJSON便于阅读。直接调用子命令jc 也支持免管道的直接调用形式$ jc ps该形式等价于执行ps并自动解析其输出。需要指定选项时可以直接编写ps -ef | jc --ps -p这类组合命令将选项控制权保留给原生命令。原始输出模式-r加上-r后解析器跳过类型转换与字段清理返回未处理的原始字符串字典此时所有字段均为字符串tty也不会被替换为null$ ps -ef | jc --ps -p -r[ { uid: root, pid: 1, ppid: 0, c: 0, stime: Nov01, tty: ?, time: 00:00:11, cmd: /usr/lib/systemd/systemd --switched-root --system --dese... }, { uid: root, pid: 2, ppid: 0, c: 0, stime: Nov01, tty: ?, time: 00:00:00, cmd: [kthreadd] } ]对比可发现处理模式下pid、ppid、c由字符串转为整数tty的?被转为null原始模式下全部保持原样。这在需要保留原始文本语义、或交由下游自行处理类型时非常有用。Python 模块用法在脚本中通过jc.parse()统一入口解析import jc result jc.parse(ps, ps_command_output)ps_command_output是包含ps原始输出的字符串。返回值为字典列表List of Dictionaries每个元素对应一行进程。底层实际调用的核心函数签名如下见 jc/parsers/ps.pydef parse(data, rawFalse, quietFalse)datastring待解析的文本数据rawboolean为True时返回未经类型转换的原始结构quietboolean为True时抑制兼容性等警告信息。返回值字典列表可以是原始或已处理的规范化结构。输出 Schema 与字段语义解析器输出的统一 Schema 如下两种输入格式的字段全集[ { uid: string, pid: integer, ppid: integer, c: integer, stime: string, tty: string, # ? 或 ?? null tt: string, # ?? null time: string, cmd: string, user: string, cpu_percent: float, mem_percent: float, vsz: integer, rss: integer, stat: string, start: string, command: string } ]各字段含义与注意点字段来源-ef/axu类型说明uid/userUID / USERstring进程属主-ef格式下为uidaxu格式下为userpidPIDinteger进程 IDppidPPIDinteger父进程 IDcCintegerCPU 使用率-ef格式的处理器占用计数stimeSTIMEstring进程启动时间日期或时刻ttyTTYstring / null控制终端?或??表示无终端处理模式转为nullttTTY部分平台列名string / null??时转为nulltimeTIMEstring累计 CPU 时间cmdCMDstring-ef格式的命令行cpu_percent%CPUfloataxu格式的 CPU 百分比由%cpu键重命名而来mem_percent%MEMfloataxu格式的内存百分比由%mem键重命名而来vszVSZinteger虚拟内存大小KBrssRSSinteger常驻内存大小KBstatSTATstring进程状态如Ss、S、R等startSTARTstringaxu格式的启动时间commandCOMMANDstringaxu格式的命令行字段名转换是显式的axu输出中的%cpu、%mem在_process()中被重命名为cpu_percent、mem_percent避免 JSON 键名中出现非法字符%。这一点在源码中有明确实现# change key name %cpu to cpu_percent if %cpu in entry: entry[cpu_percent] entry.pop(%cpu)见 jc/parsers/ps.pyaxu 格式实战示例处理模式$ ps axu | jc --ps -p[ { user: root, pid: 1, cpu_percent: 0.0, mem_percent: 0.1, vsz: 128072, rss: 6784, tty: null, stat: Ss, start: Nov09, time: 0:08, command: /usr/lib/systemd/systemd --switched-root --system --... }, { user: root, pid: 2, cpu_percent: 0.0, mem_percent: 0.0, vsz: 0, rss: 0, tty: null, stat: S, start: Nov09, time: 0:00, command: [kthreadd] }, { user: root, pid: 4, cpu_percent: 0.0, mem_percent: 0.0, vsz: 0, rss: 0, tty: null, stat: S, start: Nov09, time: 0:00, command: [kworker/0:0H] } ]原始模式$ ps axu | jc --ps -p -r[ { user: root, pid: 1, cpu_percent: 0.0, mem_percent: 0.1, vsz: 128072, rss: 6784, tty: ?, stat: Ss, start: Nov09, time: 0:08, command: /usr/lib/systemd/systemd --switched-root --system --... } ]可以看到%cpu、%mem在原始模式下仍以字符串形式存在tty保留?而处理模式下数值字段被转为float/inttty变为null。源码级解析流程ps解析器本身并不逐行编写正则而是复用 jc 的通用表格解析器整个调用链清晰简洁输入检查jc.utils.input_type_check(data)校验输入为字符串类型jc.utils.has_data(data)判断是否为空数据空输入直接返回[]测试用例test_ps_nodata也验证了parse(, quietTrue)的结果为空列表。表头规范化首行执行.lower()将UID、%CPU等表头统一为小写uid、%cpu。通用表格解析调用jc.parsers.universal.simple_table_parse()见 jc/parsers/universal.py按表头列名生成字典列表。该函数的约束与ps输出天然匹配不允许空白单元格但最后一列可以包含空格——这正是CMD/COMMAND列能保留带参数完整命令行如docker-containerd ... --state-dir ...的原因。其实现要点是headers [h for h in .join(data[0].strip().split()).split() if h] raw_data map(lambda s: s.strip().split(None, len(headers) - 1), data[1:]) raw_output [dict(zip(headers, r)) for r in raw_data]表头按空白切分数据行以split(None, len(headers) - 1)切分前 N-1 个字段按空白分列剩余部分整体归入最后一列CMD/COMMAND从而保留命令参数中的空格。规范化处理_process()%cpu→cpu_percent、%mem→mem_percent键名重命名整数转换pid、ppid、c、vsz、rss通过jc.utils.convert_to_int()转为整数浮点转换cpu_percent、mem_percent通过jc.utils.convert_to_float()转为浮点数空值清理tty为?或??时置为Nonett为??时置为None。类型集合与转换逻辑见 jc/parsers/ps.py返回rawTrue时直接返回第 3 步的原始结果否则返回第 4 步规范化后的结果。测试与跨平台验证解析器配有完整的单元测试 tests/test_ps.py覆盖了多平台、多格式的输入输出对包括输入夹具raw 文本centos-7.7/ps-ef.out、ubuntu-18.04/ps-ef.out、osx-10.11.6/ps-ef.out、osx-10.14.6/ps-ef.out以及对应的ps-axu.out期望输出JSON同名.json文件位于 tests/fixtures 目录下对应平台子目录。测试用例逐个验证ps -ef/ps axu在 CentOS 7.7、Ubuntu 18.04、macOS 10.11.6 / 10.14.6 上的解析结果与期望 JSON 完全一致同时覆盖空数据场景。以 CentOS 7.7 的真实数据为例ps-ef.out的表头为UID PID PPID C STIME TTY TIME CMD解析后tty的?全部转为null而ps-axu.out的表头为USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND解析后%cpu/%mem转为浮点、vsz/rss转为整数、tty为null与 tests/fixtures/centos-7.7/ps-axu.json 的期望输出一致。这些夹具既可作为回归测试数据也可以作为开发者理解字段映射的现成参考样例。典型应用场景拿到结构化 JSON 后可以立即接入 jq 进行过滤与聚合例如找出 CPU 占用最高的前 5 个进程$ ps axu | jc --ps | jq sort_by(-.cpu_percent) | .[0:5] | .[] | {user, pid, cpu_percent, command}或者在 Python 中按内存排序并生成告警import jc, subprocess output subprocess.run([ps, axu], capture_outputTrue, textTrue).stdout procs jc.parse(ps, output) for p in sorted(procs, keylambda x: x[mem_percent], reverseTrue)[:5]: print(p[pid], p[mem_percent], p[command])这种原生命令 → jc → 结构化数据的管线让监控脚本、巡检任务与自动化运维工具不必再依赖脆弱的正则解析也方便将进程快照直接落库或导出为 YAML配合jc的-y输出选项进行审计。局限与注意事项解析器针对-ef与axu两种固定格式设计其他ps选项组合如-aux的列顺序差异、-o自定义列不在文档声明支持范围内通用表格解析要求无空白单元格且最后一列可含空格若某些平台在中间列出现空值或列错位解析结果可能不完整需要以实际平台输出为准time、stime、start等字段保持字符串原样如00:00:11、Nov01、10:25未做日期/时间戳归一化如需统一格式应结合 jc 的datetime_iso等解析器或自行转换输出中cmd/command可能被截断显示示例中以...结尾这是 jc 文档示例的省略写法真实解析会保留完整命令行。总体而言ps解析器是 jc 命令类解析器中小而稳的典型借助通用表格解析器覆盖两种主流格式通过显式的键名重命名与类型转换输出规范化 Schema并有跨 Linux/macOS 平台的夹具测试兜底可直接用于进程监控、巡检与自动化脚本的数据化改造。赞分享开发工具【免费下载链接】jcCLI tool and python library that converts the output of popular command-line tools, file-types, and common strings to JSON, YAML, or Dictionaries. This allows piping of output to tools like jq and simplifying automation scripts.项目地址https://gitcode.com/gh_mirrors/jc/jc点击查看免费下载相关推荐使用 jc 将 macOS airport -I 命令输出解析为 JSON完整指南使用 jc 将 macOS airport I 命令输出解析为 JSON完整指南 macOS 自带的 airport I 命令可一次性输出当前 Wi Fi 连开发工具jc 解析 dpkg -l 输出将 Debian 系软件包列表转换为 JSON 的完整指南jc 解析 dpkg l 输出将 Debian 系软件包列表转换为 JSON 的完整指南 dpkg l 是 Debian/Ubuntu 系系统上查询软件包安装开发工具jc 解析器实战指南用 jc --history 将 shell history 命令输出转换为 JSONjc 解析器实战指南用 jc history 将 shell history 命令输出转换为 JSON 本指南以 jc 开源项目中的 history 解析器文开发工具上一篇10分钟掌握Elasticsearch数据迁移elasticsearch-dump工具的终极指南下一篇OptiScaler 完整指南5 种方法在 DLSS、FSR、XeSS 之间自由切换并给游戏补帧创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考