
开发工具【免费下载链接】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 仓库中的 proc-modules 解析器文档 及其源码实现展开讲解如何将 Linux 的/proc/modules当前已加载内核模块清单转换为 JSON / YAML / Python 字典包括三种 CLI 调用方式直接指定文件、管道、自动识别 proc 文件、输出的 6 字段 Schema 与 raw/processed 两种模式、以及jc/parsers/proc_modules.py中逐行解析与类型转换的底层逻辑读完即可在自动化脚本中可靠地查询“某模块被哪些模块依赖”“模块占用内存大小”等信息。一、解析对象/proc/modules 的文件格式/proc/modules是 Linux 内核暴露的已加载模块列表每行一个模块共 6 个空格分隔的字段。jc 仓库测试夹具 tests/fixtures/linux-proc/modules 给出了真实样例binfmt_misc 24576 1 - Live 0xffffffffc0ab4000 vsock_loopback 16384 0 - Live 0xffffffffc0a14000 vmw_vsock_virtio_transport_common 36864 1 vsock_loopback, Live 0xffffffffc0a03000 vsock 45056 5 vsock_loopback,vmw_vsock_virtio_transport_common,vmw_vsock_vmci_transport, Live 0xffffffffc09f7000各字段含义对应 jc 输出的 JSON 键名字段类型processed 模式说明modulestring内核模块名称sizeinteger模块占用的内存大小字节usedinteger该模块被其他模块引用的次数used_bystring[]依赖本模块的模块名列表原文中为-时表示空列表多个依赖以逗号分隔且末尾带一个尾随逗号statusstring模块状态如Livelocationstring模块加载的内核地址形如0xffffffffc0ab4000注意原文中used_by字段有一个容易踩坑的细节它形如vsock_loopback,末尾带逗号。解析器需要去掉切分后产生的空元素这一点在源码实现中有专门处理下文详述。二、CLI 使用方式1. 三种等价调用方式按 官方文档解析/proc/modules有三种 CLI 写法# 方式一通过通用的 --proc 解析器自动识别文件类型 $ cat /proc/modules | jc --proc # 方式二magic syntax直接把 /proc 文件路径作为参数 $ jc /proc/modules # 方式三直接指定专用解析器 --proc-modules $ cat /proc/modules | jc --proc-modules模块命名遵循 jc 的约定CLI 中用连字符proc-modulesPython 模块名用下划线proc_modules见 jc/lib.py 中的解析器注册表proc-modules在列表中注册。2. magic syntax 的附加能力jc/parsers/proc.py 的文档字符串说明了jc /proc/path这种 magic syntax 的细节所有jc选项必须写在/proc路径之前支持“slurping”批量多个文件作为输入例如jc /proc/*/stat此时所有输出会被包裹在数组里并且输出中包含一个_file字段用于把每条结果与输入文件对应起来还可以加--meta-out选项列出所有/proc输入文件辅助与输出列表做关联。3. 常用输出选项-ppretty print格式化缩进输出 JSON-rraw 模式保留未经类型转换的原始字符串值见下节示例。三、输出 Schema 与示例Schema解析结果为对象数组Schema 定义如下继承自文档[ { module: string, size: integer, used: integer, used_by: [ string ], status: string, location: string } ]processed 模式默认$ cat /proc/modules | jc --proc -p[ { module: binfmt_misc, size: 24576, used: 1, used_by: [], status: Live, location: 0xffffffffc0ab4000 }, { module: vsock_loopback, size: 16384, used: 0, used_by: [], status: Live, location: 0xffffffffc0a14000 }, { module: vmw_vsock_virtio_transport_common, size: 36864, used: 1, used_by: [ vsock_loopback ], status: Live, location: 0xffffffffc0a03000 } ]可以看到size和used被转成了 JSON 数字原文中的-变成了空数组[]尾随逗号被正确去掉。raw 模式-r$ cat /proc/modules | jc --proc-modules -p -r[ { module: binfmt_misc, size: 24576, used: 1, used_by: [], status: Live, location: 0xffffffffc0ab4000 } ]raw 模式下size、used保留为字符串。需要数值计算、按大小排序等场景时应使用默认 processed 模式。四、源码实现剖析jc/parsers/proc_modules.pyjc/parsers/proc_modules.py 整体很短但每个环节都对应/proc/modules格式的一个特性。1. 元信息class info(): Provides parser metadata (version, author, etc.) version 1.0 description /proc/modules file parser author Kelly Brazil author_email kellyjonbrazilgmail.com compatible [linux] tags [file] hidden Truecompatible [linux]声明该解析器仅针对 Linuxparse()入口处会调用jc.utils.compatibility()做平台检查tags [file]表明它是文件内容类解析器从源码结构看hidden True表示这是一个隐藏解析器不会出现在默认解析器清单中但仍可通过--proc-modules显式调用版本 1.0作者 Kelly Brazil与文档末尾的 Parser Information 一致。2. parse()逐行切分六字段核心解析逻辑jc/parsers/proc_modules.pyif jc.utils.has_data(data): for line in filter(None, data.splitlines()): module, size, used, used_by, status, location line.split() used_by_list used_by.split(,)[:-1] raw_output.append( { module: module, size: size, used: used, used_by: used_by_list, status: status, location: location } ) return raw_output if raw else _process(raw_output)几个值得注意的细节filter(None, data.splitlines())先过滤空行因此输入尾部空行不会报错line.split()依赖/proc/modules每行恰好 6 个空格分隔字段的格式。若某行字段数不是 6例如异常输出元组解包会抛出ValueError——这是一种隐含的格式校验used_by.split(,)[:-1]是处理原文“尾随逗号”的关键vsock_loopback,切分后是[vsock_loopback, ]去掉最后一个空字符串即为[vsock_loopback]当原文是-时切分得到[-]去掉最后一个元素后恰好是空列表[]两种情况被同一表达式统一处理空输入时jc.utils.has_data(data)为假直接返回空列表[]。3. _process()数值类型转换def _process(proc_data: List[Dict]) - List[Dict]: int_list {size, used} for entry in proc_data: for key in entry: if key in int_list: entry[key] jc.utils.convert_to_int(entry[key]) return proc_data只有size和used两个键参与转换location虽然也是数字串十六进制地址但按字符串保留避免丢失前导0x与十六进制语义。jc.utils.convert_to_intjc/utils.py的行为是先剥除字符串中所有非数字字符正则[^0-9\-\.]优先int()转换失败再回退int(float())最终都失败返回None。这对/proc/modules这类纯十进制数字字段是稳妥的兜底实现。4. parse() 的公共校验入口def parse(data: str, raw: bool False, quiet: bool False) - List[Dict]: jc.utils.compatibility(__name__, info.compatible, quiet) jc.utils.input_type_check(data)compatibility()非 Linux 平台会给出兼容性警告quietTrue时抑制input_type_check()确保data是字符串防止传入二进制或 None。五、jc --proc 如何自动识别 /proc/modules方式一jc --proc之所以不需要显式指定子解析器是因为 jc/parsers/proc.py 实现了一个“签名匹配”的分发器它维护一组正则签名signatures与解析器名的映射表procmap其中识别/proc/modules的正则为jc/parsers/proc.pymodules_p re.compile(r^\w \d \d (?:-|\w,).*0x[0-9a-f]{16}\n)其语义正好对应/proc/modules的一行模块名 数字 数字 -或“模块名, ” 结尾的 16 位十六进制地址。parse()遍历procmap首个正则命中的数据即交给对应的专用解析器执行get_parser(proc_modules).parse(...)见 jc/parsers/proc.py。若数据不匹配任何签名抛出ParseError(Proc file could not be identified.)签名命中但模块缺失时抛出ParseError(Proc file type not yet implemented.)。这意味着三种调用方式最终殊途同归--proc自动分发到proc_modules--proc-modules直接调用magic syntax 也走同一个分发逻辑。六、在 Python 中调用除 CLI 外jc 作为 Python 库直接可用对应文档中的 Usage (module) 部分import jc with open(/proc/modules) as f: proc_modules_file f.read() # 通用 proc 分发自动识别 result jc.parse(proc, proc_modules_file) # 或显式指定 proc_modules 解析器 result jc.parse(proc_modules, proc_modules_file)parse()的签名与参数继承自文档def parse(data: str, raw: bool False, quiet: bool False) - List[Dict]data(string) 待解析的文本数据raw(boolean) 为 True 时返回未做类型转换的原始结构化数据quiet(boolean) 为 True 时抑制警告信息返回值为List[Dict]即上文 Schema 描述的模块对象数组。典型用法如查询“哪些模块依赖 bluetooth”import jc mods jc.parse(proc_modules, open(/proc/modules).read()) deps [m for m in mods if bluetooth in m[used_by]]七、测试与夹具该解析器的单元测试位于 tests/test_proc_modules.py覆盖两个场景test_proc_modules_nodata空字符串输入应返回[]test_proc_modules读取夹具 tests/fixtures/linux-proc/modules真实的 92 行/proc/modules快照断言解析结果与期望 JSON tests/fixtures/linux-proc/modules.json 完全一致。期望 JSON 中对多依赖模块的转换结果可直接作为参考实现例如vsock模块{module: vsock, size: 45056, used: 5, used_by: [vsock_loopback, vmw_vsock_virtio_transport_common, vmw_vsock_vmci_transport], status: Live, location: 0xffffffffc09f7000}八、适用平台、限制与排错平台解析器声明compatible [linux]仅适用于 Linux 的/proc/modules在非 Linux 系统上调用会收到兼容性警告源码见 jc/parsers/proc_modules.py输入要求数据必须为符合“6 空格分隔字段”格式的文本空输入安全地返回空列表而非抛错版本能力当前仓库中该解析器版本为 1.0Schema 仅包含上述 6 个字段不包含模块描述description等扩展信息排错提示若使用jc --proc提示Proc file could not be identified.说明数据不匹配 proc 签名正则可能是文件被截断或不是/proc/modules内容若手动管道内容出现解包异常应检查是否有字段数异常的行raw 与 processed 的选择做数值比较、聚合统计用默认模式需要保留原始字符串如与系统工具原始输出做 diff时用-r/rawTrue。综上jc 的 proc-modules 解析器以极小的实现成本约百行代码完成了/proc/modules的结构化利用固定 6 字段格式做位置解包用一行[:-1]同时兼容-与尾随逗号两种used_by形态再以convert_to_int统一数值转换并通过 proc 分发器的正则签名无缝接入jc --proc自动识别链路是“把 Linux 运行时状态接入 JSON 管道”的典型示例。赞分享开发工具【免费下载链接】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 lsmod 解析器详解把 Linux 内核模块清单转为结构化 JSONjc lsmod 解析器详解把 Linux 内核模块清单转为结构化 JSON 本篇技术指南围绕 jc 项目中的 lsmod 解析器展开覆盖命令行调用方式、P开发工具jc proc_meminfo 解析器详解把 Linux /proc/meminfo 内存信息文件转换为结构化 JSONjc proc_meminfo 解析器详解把 Linux /proc/meminfo 内存信息文件转换为结构化 JSON jcJSON Convert中的开发工具jc proc-cpuinfo 解析器将 Linux /proc/cpuinfo 精准转换为结构化 JSONjc proc cpuinfo 解析器将 Linux /proc/cpuinfo 精准转换为结构化 JSON 本文基于 proc_cpuinfo 解析器文档开发工具上一篇TFT_eSPI深度解析嵌入式显示开发的三大痛点与解决方案下一篇2025最新Gotenberg使用指南从安装到部署的完整流程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考