开发工具【免费下载链接】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),仅供参考
企业数字化 ERP 产品动态
相关推荐
数据库课程设计闭环方案:E-R图+SQL脚本+Python CRUD 简介:本资源是一份面向高校数据库课程学习者的Python图书管理系统完整实践方案,适用于期末大作业、课程设计等教学场景,特别适合数据库初学者快速上手并理解E-R建模、SQL脚本编写与前后端基础交互逻辑。压缩包共9个文件,含4个结构… · 2026/9/25 6:48:58
神经实验必备:脑切片模具选型与实操全攻略 1. 脑切片模具是什么,做神经实验为什么绕不开它1.1 一张图看懂这个工具的功能边界先直接说结论:脑切片模具是一块带有多条平行凹槽的金属或有机玻璃槽体,把脑组织放进去、用刮胡刀片沿着槽缝切下去,就能获得厚度均匀、平面平整的脑… · 2026/9/25 6:48:58
讯维全域智能管控平台权限管理:RBAC模型与数据权限实战解析 干过全域智能管控平台项目的朋友应该都有体会:大屏联动、视频调度、告警推送这些功能做起来再复杂,起码逻辑是看得见摸得着的。但权限管理不一样,它平时不显山不露水,一出问题就是大问题——某个部门的值班员能点开另一个部门的布… · 2026/9/25 7:18:07
ITIL4服务目录落地指南:从救火队到服务专家的转型路径 干运维这活儿十几年,我见过太多团队一直困在"救火队"的状态里。早上一睁眼,报障群就是几十条未读:网络怎么又卡了、财务系统登不上去、新来的同事还没邮箱账号……一整天人都是碎的,到了晚上复盘,却发现好像… · 2026/9/25 7:18:07
Atlas 300V 24G运算加速卡跑YOLO:从环境搭建到推理调优 最近好几个做边缘AI的朋友都在问同一个问题:Atlas 300V 24G到底是不是运算加速卡,能不能拿来跑YOLO。这问题看起来简单,但真正上手折腾过的人都知道,华为Atlas这套东西从硬件选型到CANN工具链,再到模型转换和推理调优&… · 2026/9/25 7:18:07
软件工程实践——软件评测作业:用 TaoToken 统一 Key 跑通 Cline 配置与评测脚本 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 7:18:07
Atlas 300V 24G部署YOLO实战:从CANN环境到模型转换与推理调优 1. 先掰扯清楚:Atlas 300V 24G到底是“什么卡”最近后台好几个朋友问我一件事:买了一张Atlas 300V 24G,打算部署YOLO做目标检测,结果折腾了好几天,模型转换不过去、推理速度上不来,甚至有人卡在第一步——没… · 2026/9/25 7:17:54
创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:31
MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:37