开发工具【免费下载链接】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 项目中的pci_ids解析器展开讲解如何将 Linux/Unix 系统中广泛使用的 PCI ID 数据库文件pci.ids转换为结构化 JSON并通过jq等工具进行高效的层级查询。阅读本文后你将掌握jc --pci-ids的命令行用法、jc.parse(pci_ids, ...)的 Python 模块调用方式、解析结果的嵌套 Schema 结构以及底层逐行解析实现原理与对应的测试验证方法。解析器是什么把文本数据库变成 JSONpci_ids是 jc 内置的pci.ids文件解析器。pci.ids是 PCI ID 项目pciutils/pciids维护的一份公开数据库文件记录了厂商vendor、设备device、子系统subsystem以及设备类别class / subclass / prog-if的十六进制编号与名称映射。该文件通常体积较大数以万行纯文本格式虽然便于维护却难以直接用于脚本自动化。jc 的 pci_ids.py 负责把它解析成一个分层的字典结构方便用jq、Python 字典操作或其它 JSON 工具做检索。该解析器在 jc 的解析器注册表中对应命令行名称pci-ids见 jc/lib.py因此 CLI 调用形式为jc --pci-ids。其完整解析逻辑位于 jc/parsers/pci_ids.py官方文档参见 docs/parsers/pci_ids.md。命令行用法将pci.ids文件内容通过标准输入管道交给 jc 即可$ cat pci.ids | jc --pci-ids输出是符合下述 Schema 的 JSON 对象。配合jq可以立即做定向查询例如查询 PEAK-System 公司某个子系统名称$ cat pci.ids | jc --pci-ids | jq .vendors._001c._0001._001c._0005.subsystem_name 2 Channel CAN Bus SJC1000 (Optically Isolated)再如查询 USB 类别下0c/03/40对应的编程接口prog-if名称$ cat pci.ids | jc --pci-ids | jq .classes._0c._03._40 USB4 Host InterfacePython 模块用法在 Python 代码中调用jc.parse()第一个参数传解析器名称pci_ids第二个参数传文件内容字符串import jc with open(pci.ids, r, encodingutf-8) as f: pci_ids_file_output f.read() result jc.parse(pci_ids, pci_ids_file_output)result即为符合 Schema 的字典Dict可直接用 Python 键访问也可以序列化为 JSON 供下游使用。parse 函数签名解析器暴露的主入口是parse()函数def parse(data: str, raw: bool False, quiet: bool False) - Dict[str, Any]data(string) 待解析的文本数据raw(boolean) 为 True 时返回未经最终处理的原始输出quiet(boolean) 为 True 时抑制警告信息。返回值为字典rawTrue时返回原始结构化数据否则返回符合 Schema 的处理后数据。在源码实现中parse()会先调用jc.utils.compatibility()与jc.utils.input_type_check()做运行环境与输入类型检查再逐行解析见 jc/parsers/pci_ids.py。输出 Schema为 jq 优化的嵌套结构解析结果包含两个顶层键vendors与classes。其结构如下{ vendors: { _vendor_id: { vendor_name: string, _device_id: { device_name: string, _subvendor_id: { _subdevice_id: string } } } }, classes: { _class_id: { class_name: string, _subclass_id: { subclass_name: string, _prog_if: string } } } }需要注意两个设计要点十六进制编号一律加了_前缀。由于 JSON 键名以数字开头时在jq中无法直接使用点号访问会与数字字面量冲突解析器为所有 ID 键统一加上下划线前缀从而避免了使用括号记法bracket notation。这保证了jq查询既简洁又安全。最深一层子系统名称、prog-if 名称直接以字符串为值而其余层级均嵌套对象形成了清晰的“厂商 → 设备 → 子系统”和“类别 → 子类 → 编程接口”两级/三级树。键位映射速查对于vendors分支_001c._0001._001c._0005中的每一段对应jq .vendors._001c._0001._001c._0005.subsystem_name | | | | | | | subdevice | | subvendor | device vendor对于classes分支_0c._03._40中的每一段对应jq .classes._0c._03._40 | | | | | prog_if | subclass class底层实现正则驱动的逐行状态解析从源码可以确认该解析器基于行级正则匹配实现见 jc/parsers/pci_ids.py核心模式如下厂商行无缩进^(?Pvendor_id[0-9a-f]{4})\s(?Pvendor_name.)设备行单个 Tab^\t(?Pdevice_id[0-9a-f]{4})\s(?Pdevice_name.)子系统行两个 Tab^\t\t(?Psubvendor[0-9a-f]{4})\s(?Psubdevice[0-9a-f]{4})\s(?Psubsystem_name.)类别行C前缀^C\s(?Pclass_id[0-9a-f]{2})\s(?Pclass_name.)子类行单 Tab^\t(?Psubclass_id[0-9a-f]{2})\s(?Psubclass_name.)prog-if 行双 Tab^\t\t(?Pprog_if_id[0-9a-f]{2})\s(?Pprog_if_name.)解析过程对每一行依次尝试上述模式命中后写入对应的临时对象当读到新的厂商/类别块头时将上一块整体提交到输出字典。pci.ids文件自带的注释行以#开头与空行不会被任何模式命中因此被自然忽略。整个循环结束后parse()返回raw_output if raw else _process(raw_output)其中_process()在此解析器中为原样返回的透传处理见 jc/parsers/pci_ids.py。文档中的示例片段也印证了这一语法约定见 docs/parsers/pci_ids.md# 厂商行 001c PEAK-System Technik GmbH # 设备行单 Tab 0001 PCAN-PCI CAN-Bus controller # 子系统行双 Tab 001c 0004 2 Channel CAN Bus SJC1000以及类别块C 01 Mass storage controller 01 IDE interface 00 ISA Compatibility mode-only controller实际效果验证测试与 Fixtures仓库自带的单元测试 tests/test_pci_ids.py 直接验证了该解析器的行为它读取tests/fixtures/generic/pci.ids作为输入与期望输出tests/fixtures/generic/pci.ids.json逐字比对test_pci_ids并额外覆盖了空输入场景test_pci_ids_nodata期望返回空字典{}。fixtures 中的 JSON 真实地展示了输出形态例如{ vendors: { _001c: { vendor_name: PEAK-System Technik GmbH, _0001: { device_name: PCAN-PCI CAN-Bus controller, _001c: { _0004: {subsystem_name: 2 Channel CAN Bus SJC1000}, _0005: {subsystem_name: 2 Channel CAN Bus SJC1000 (Optically Isolated)} } } } }, classes: { _0c: { class_name: Serial bus controller, _03: { subclass_name: USB controller, _40: USB4 Host Interface } } } }读者可以自行在仓库中打开 pci.ids 与 pci.ids.json 对照理解文本与 JSON 的对应关系。兼容性与注意事项解析器元数据声明其适用于linux, darwin, cygwin, win32, aix, freebsd平台见 jc/parsers/pci_ids.py标签为file类型即处理文件内容而非命令输出。解析逻辑依赖 Tab 缩进区分层级设备行必须为单 Tab前缀子系统行必须为双 Tab前缀类别块内的子类与 prog-if 同理。使用该解析器前建议确认手头的pci.ids文件符合 pciutils 官方格式。顶层键仅当对应数据存在时才出现空输入返回空字典行为已由test_pci_ids_nodata固化。小结jc --pci-ids把面向人类阅读的 PCI ID 数据库转换成树形 JSON配合_前缀设计使得jq路径查询直观而稳定。无论是硬件信息审计脚本、PCI 设备识别工具还是需要在自动化流程中检索厂商/设备/类别名称的场景该解析器都能提供标准化的数据入口。其实现简洁正则逐行解析、无第三方依赖、测试覆盖完整是理解 jc“解析器如何把文本变 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 解析器实战将 Linux /proc/interrupts 转换为可查询的 JSON 结构jc 解析器实战将 Linux /proc/interrupts 转换为可查询的 JSON 结构 Linux 系统中 /proc/interrupts 是排查开发工具jc mdadm 解析器将 RAID 阵列状态输出转为可查询的 JSON 结构jc mdadm 解析器将 RAID 阵列状态输出转为可查询的 JSON 结构 jc 的 mdadm 解析器将 Linux mdadm 工具 query 阵开发工具jc 的 ss 解析器实战指南将 Linux ss 命令输出转换为 JSON 结构化数据jc 的 ss 解析器实战指南将 Linux ss 命令输出转换为 JSON 结构化数据 ss 是 Linux 上用于查看套接字socket统计信息的主流开发工具上一篇Cherry Studio BootConfig Schema 指南启动级配置键的添加与 V1 到 V2 数据迁移下一篇绝地求生压枪秘籍罗技鼠标宏让你的射击稳如泰山创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
