ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

jc 解析 `dpkg -l` 输出:将 Debian 系软件包列表转换为 JSON 的完整指南

jc 解析 `dpkg -l` 输出:将 Debian 系软件包列表转换为 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点击查看免费下载dpkg -l是 Debian/Ubuntu 系系统上查询软件包安装状态的经典命令但其文本表格输出难以直接用于脚本判断与自动化处理。jc 的dpkg_l解析器可以将dpkg -l的输出转换为结构化的 JSON/YAML/字典并附带desired、status、error等派生字段让你可以像处理普通数据一样处理软件包列表。读完本文你将掌握dpkg_l的 CLI 用法、模块化调用方式、输出 Schema 与状态码映射原理并能用 jq 完成“统计已安装软件包”“筛选残留配置文件”等实战任务。背景为什么需要解析dpkg -ldpkg -l的输出是一张固定列宽的对齐表格每行包含两字符状态码、软件包名、版本号、架构与描述。这种格式适合人眼阅读却不适合脚本字段按空格切分时描述列可能含空格版本号可能被截断而且状态码如ii、rc、uWR的含义需要额外解释。jc 的dpkg_l解析器jc/parsers/dpkg_l.py专门解决这一问题它把表格规整为字典列表并把状态码翻译成可读的desired/status/error字段。避免字段截断设置 COLUMNS 环境变量dpkg -l的输出宽度受终端列数影响默认宽度下版本号和描述会被截断描述后会出现...。文档明确建议在调用前将COLUMNS设为一个较大的值$ COLUMNS500 dpkg -l | jc --dpkg-lCOLUMNS500会告知 dpkg 按 500 列宽度排版从而避免字段被截断。仓库测试用例中专门包含dpkg-l-columns500.out与dpkg-l-columns500.json两个 fixture见 tests/test_dpkg_l.py验证了宽列输出下的解析正确性。在管道场景中该写法只影响本次命令不会污染当前 shell。基本用法CLI 方式管道输入输出 JSON$ dpkg -l | jc --dpkg-l或让 jc 直接调用命令借助magic_commands自动关联解析器$ jc dpkg -l第二种写法之所以可行是因为解析器元数据中声明了magic_commands [dpkg -l]jc/parsers/dpkg_l.pyjc CLI 会据此把命令与解析器自动匹配相关逻辑位于 jc/cli.py。注意该解析器仅兼容 Linuxcompatible [linux]。模块方式在 Python 中通过jc.parse()调用import jc result jc.parse(dpkg_l, dpkg_command_output)jc.parse()的第一个参数是解析器名称dpkg_l第二个参数为dpkg -l的原始文本输出返回值为字典列表。输出 Schema 与字段含义处理后的输出遵循如下结构[ { codes: ii, name: accountsservice, version: 0.6.45-1ubuntu1.3, architecture: amd64, description: query and manipulate user account information, desired: install, status: installed, error: reinstall required } ]各字段含义字段类型说明codesstring原始两字符或三字符状态码原样保留namestring软件包名versionstring软件包版本号architecturestring软件包架构如amd64、alldescriptionstring软件包描述可能带...截断标记desiredstring期望状态仅非 raw 模式unknown/install/remove/purge/holdstatusstring当前状态仅非 raw 模式not installed/installed/config-files/unpacked/failed config/half installed/trigger await/trigger pendingerrorstring错误状态仅非 raw 模式且存在时reinstall requireddesired、status、error三个字段是 jc 从状态码中派生出来的映射逻辑见下文“状态码解码原理”。实战示例完整示例处理模式$ dpkg -l | jc --dpkg-l -p [ { codes: ii, name: accountsservice, version: 0.6.45-1ubuntu1.3, architecture: amd64, description: query and manipulate user account information, desired: install, status: installed }, { codes: rc, name: acl, version: 2.2.52-3build1, architecture: amd64, description: Access control list utilities, desired: remove, status: config-files }, { codes: uWR, name: acpi, version: 1.7-1.1, architecture: amd64, description: displays information on ACPI devices, desired: unknown, status: trigger await, error: reinstall required }, { codes: rh, name: acpid, version: 1:2.0.28-1ubuntu1, architecture: amd64, description: Advanced Configuration and Power Interface..., desired: remove, status: half installed }, { codes: pn, name: adduser, version: 3.116ubuntu1, architecture: all, description: add and remove users and groups, desired: purge, status: not installed } ]原始模式示例-r加-rraw只做表格结构化不做状态码翻译因此输出中只有codes而没有desired/status/error$ dpkg -l | jc --dpkg-l -p -r [ { codes: ii, name: accountsservice, version: 0.6.45-1ubuntu1.3, architecture: amd64, description: query and manipulate user account information }, { codes: rc, name: acl, version: 2.2.52-3build1, architecture: amd64, description: Access control list utilities } ]CLI 中-ppretty控制输出缩进美化-rraw控制是否跳过状态码派生选项解析见 jc/cli.py。解析原理从表格到字典dpkg_l.parse()的核心流程jc/parsers/dpkg_l.py可分为三步定位表头并清洗逐行扫描输入找到包含Architecture的表头行后开始记录数据将表头DesiredUnknown/Install/Remove/Purge/Hold | StatusNot/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend |/ Err?中的||/替换为列名codes对应原始状态码列并整体转为小写跳过这类分隔线同时过滤空行。表格结构化清洗后的行交给通用工具jc.parsers.universal.simple_table_parse()jc/parsers/universal.py按空白切分。该工具以表头作为键、按列拆分数据行且描述列允许含空格切分时保留剩余部分最终生成原始字典列表raw_output。状态码派生非 raw 模式下调用_process()完成字段翻译见下一节。parse(data, rawFalse, quietFalse)的签名中quiet用于抑制兼容性警告解析器还会通过jc.utils做输入类型校验非字符串输入会报错与数据存在性检查空输入时直接返回[]测试test_dpkg_l_nodata验证了这一行为。状态码解码原理desired / status / error 的映射Debian 软件包状态码的第一位表示期望状态Desired第二位表示实际状态Status可能出现的第三位是错误标志Err。_process()中的映射表如下码desired 值码status 值uunknownnnot installediinstalliinstalledrremovecconfig-filesppurgeuunpackedhholdffailed confighhalf installedwtrigger awaitttrigger pending第三位错误标志仅有一个r→reinstall required。实现时_process()对每条记录执行desired, status, *err list(entry[codes].lower())分别查表得到desired、status若存在第三位且命中错误映射则写入error。以示例中的uWR为例小写后为uwr映射为desiredunknown、statustrigger await、errorreinstall requiredrh则映射为desiredremove、statushalf installed。这也是示例中codes列与desired/status/error字段一一对应的来源。状态码解读速查表dpkg -l输出中的常见状态组合对应到 jc 派生字段codesdesiredstatus典型含义iiinstallinstalled已安装且运行正常rcremoveconfig-files已删除但残留配置文件pnpurgenot installed已彻底清除rhremovehalf installed安装过程中断处于半安装状态uWRunknowntrigger await状态未知、等待触发器且需要重装iUinstallunpacked已解包但未完成配置这一速查表可以直接与 jq 组合使用。例如统计系统中已安装的软件包数量$ dpkg -l | jc --dpkg-l | jq [.[] | select(.status installed)] | length筛选出残留配置文件、值得清理的软件包$ dpkg -l | jc --dpkg-l | jq .[] | select(.status config-files) | .name查找某个软件包是否已安装$ dpkg -l | jc --dpkg-l | jq .[] | select(.name openssh-server) | {version, status}解析器的元数据与测试保障解析器通过info类暴露元数据jc/parsers/dpkg_l.py版本1.3作者 Kelly Brazil兼容平台linux关联命令dpkg -lmagic_commands标签command测试方面tests/test_dpkg_l.py 覆盖了三条路径空输入返回[]常规 Ubuntu 18.04 输出解析dpkg-l.out→dpkg-l.jsonfixture 位于 tests/fixtures/ubuntu-18.04COLUMNS500宽列输出解析dpkg-l-columns500.out→dpkg-l-columns500.json多字符状态码含uWR第三位错误码解析dpkg-l-codes.out→dpkg-l-codes.json。其中dpkg-l-codes.json中的linux-image-*记录展示了rc状态在真实系统中的典型场景旧内核包被移除后仅残留config-files。这些用例确保解析器在字段截断、状态码带错误标志等边界情况下输出稳定。总结jc --dpkg-l把dpkg -l的文本表格变成结构化 JSON核心价值有三点一是通过COLUMNS500规避字段截断二是保留原始codes的同时派生出desired/status/error可读字段三是配合 jq 可快速完成软件包统计、残留包清理筛查等自动化任务。若你只需表格结构化、不关心状态码翻译用-r原始模式即可。更多解析器与通用用法可参阅 docs/parsers/dpkg_l.md 与 docs/readme.md。赞分享开发工具【免费下载链接】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 解析 dmidecode将 Linux 硬件信息 DMI 输出转换为 JSON 的完整指南jc 解析 dmidecode将 Linux 硬件信息 DMI 输出转换为 JSON 的完整指南 导读 dmidecode 是 Linux 系统上读取 SMB开发工具jc nmcli 解析器将 NetworkManager nmcli 输出转换为 JSON/YAML/字典的完整指南jc nmcli 解析器将 NetworkManager nmcli 输出转换为 JSON/YAML/字典的完整指南 在 Linux 网络自动化中 nmcl开发工具jc 解析器实战将 debconf-show 包配置输出转换为 JSONjc 解析器实战将 debconf show 包配置输出转换为 JSON 本指南围绕 jc 项目的 debconf show 解析器展开讲解如何把 Debi开发工具上一篇抖音批量下载工具上手指南3步跑通去水印与增量下载下一篇XFlow 开源项目教程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表