新闻详情

新闻详情

首页 / 资讯中心 / 详情

jc 解析器实战:使用 jc --sfdisk 将 sfdisk 分区表输出转换为 JSON

发布时间:2026/9/26 3:03:58来源:尧图网络
jc 解析器实战:使用 jc --sfdisk 将 sfdisk 分区表输出转换为 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是一个把常用命令行工具输出、文件类型和通用字符串转换为 JSON / YAML / Python 字典的 CLI 工具与 Python 库。本文聚焦其内置的sfdisk解析器讲解如何将 Linux 磁盘分区工具sfdisk的-l列出分区表、-F列出未分区空间以及旧版-d输出解析为结构化数据覆盖完整 Schema、新旧 util-linux 输出格式差异、CLI 与 Python 模块两种用法并结合仓库源码与测试用例说明底层解析原理。读完本文你将能把sfdisk输出直接管道给jq等工具用于磁盘巡检、自动化脚本与监控报表。一、解析器概览支持范围与兼容性sfdisk解析器位于 jc/parsers/sfdisk.py其元数据见info类表明版本1.3作者Kelly Brazil兼容平台linuxcompatible [linux]魔法命令magic commandssfdisk——这意味着 CLI 下可以直接写jc sfdisk -ljc 会根据命令名自动匹配解析器无需显式指定--sfdisk解析器支持的sfdisk选项如下选项说明-l列出磁盘分区表核心支持项-F列出未分区空间free sectors-d已弃用仅适用于旧版 util-linux输出分区定义脚本-uM/-uC/-uS/-uB已弃用仅适用于旧版 util-linux分别以 MB、柱面、扇区、字节为单位显示从源码的状态机逻辑看解析器同时兼容了多种 util-linux 版本的行文格式这一点在后文“输出格式演进”中详细展开。二、快速上手CLI 与 Python 模块两种用法2.1 CLI 用法# 方式一管道输入 sfdisk -l | jc --sfdisk # 方式二魔法命令直接解析依赖 magic_commands jc sfdisk -l配合-p参数可以输出美化的prettyJSON配合-r参数输出未处理的原始字符串数据sfdisk -l | jc --sfdisk -p # 美化输出 sfdisk -l | jc --sfdisk -p -r # 原始字符串输出raw 模式2.2 Python 模块用法import jc result jc.parse(sfdisk, sfdisk_command_output)jc.parse返回一个字典Dict列表每个元素对应一块磁盘。如果对解析流程需要更细粒度的控制也可以直接调用解析器模块的parse函数import jc.parsers.sfdisk result jc.parsers.sfdisk.parse(sfdisk_command_output) # 结构化输出 result_raw jc.parsers.sfdisk.parse(sfdisk_command_output, rawTrue) result_quiet jc.parsers.sfdisk.parse(sfdisk_command_output, quietTrue)parse函数的签名与语义与 jc/parsers/sfdisk.py 中的实现一致参数类型说明datastring待解析的文本数据rawboolean为 True 时返回未处理的原始输出字符串字段quietboolean为 True 时抑制警告信息例如在非 linux 平台上运行时的兼容性提示三、输出 Schema 完整说明解析器的最终输出是一个列表每个元素对应一块磁盘整体结构如下与文档 Schema 完全一致[ { disk: string, disk_size: string, free_disk_size: string, bytes: integer, free_bytes: integer, sectors: integer, free_sectors: integer, cylinders: integer, heads: integer, sectors_per_track: integer, units: string, logical_sector_size: integer, physical_sector_size: integer, min_io_size: integer, optimal_io_size: integer, disk_label_type: string, disk_identifier: string, disk_model: string, partitions: [ { device: string, boot: boolean, start: integer, end: integer, size: string, cyls: integer, mib: integer, blocks: integer, sectors: integer, id: string, system: string, type: string } ] } ]3.1 顶层字段含义字段类型来源diskstring磁盘设备名如/dev/sdadisk_sizestring磁盘总容量如20 GiB来自现代格式的Disk ...:行free_disk_sizestring未分区空间容量来自sfdisk -F的Unpartitioned space行bytesinteger磁盘总字节数free_bytesinteger未分区空间字节数sectorsinteger磁盘总扇区数free_sectorsinteger未分区空间扇区数cylinders/heads/sectors_per_trackintegerCHS 几何参数来自旧版Disk ...: N cylinders, N heads, N sectors/track行unitsstring单位说明文本如sectors of 1 * 512 512 byteslogical_sector_size/physical_sector_sizeinteger逻辑/物理扇区大小来自Sector size (logical/physical):行min_io_size/optimal_io_sizeinteger最小/最优 I/O 大小来自I/O size (minimum/optimal):行disk_label_typestring磁盘标签类型如dos、gpt来自Disklabel type:行disk_identifierstring磁盘标识符如0x3719ef0f来自Disk identifier:行disk_modelstring磁盘型号来自Disk model:行3.2 分区partitions字段含义字段类型说明devicestring分区设备名如/dev/sda1bootboolean是否可引导分区源码中通过*标记转换为布尔值start/endinteger起始/结束位置单位取决于units扇区或柱面sizestring分区大小如19G注意使用已弃用的-d选项时该字段为 integer见 Schema 注释 [0]cylsinteger分区占用柱面数旧版格式表头#cylsmibinteger分区大小MiB来自已弃用的-uM输出blocksinteger分区块数旧版格式表头#blockssectorsinteger分区扇区数现代格式表头Sectorsidstring分区类型 ID如83、8e、82systemstring分区系统类型旧版格式表头System如Linux、Linux LVMtypestring分区类型现代格式表头Type如Linux、Extended、Linux swap / Solaris说明system与type字段的差异源于 util-linux 新旧版本的表头命名不同解析器通过读取表头行动态决定列名而不是硬编码。四、实战示例从原始输出到 JSON4.1 现代 util-linuxv2.32.0格式sfdisk -l以 Debian 10 为例原始输出见 tests/fixtures/debian10/sfdisk-l.outDisk /dev/sda: 20 GiB, 21474836480 bytes, 41943040 sectors Disk model: VMware Virtual S Units: sectors of 1 * 512 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disklabel type: dos Disk identifier: 0x3719ef0f Device Boot Start End Sectors Size Id Type /dev/sda1 * 2048 39942143 39940096 19G 83 Linux /dev/sda2 39944190 41940991 1996802 975M 5 Extended /dev/sda5 39944192 41940991 1996800 975M 82 Linux swap / Solaris执行sfdisk -l | jc --sfdisk -p后得到对应 tests/fixtures/debian10/sfdisk-l.json[ { disk: /dev/sda, disk_size: 20 GiB, bytes: 21474836480, sectors: 41943040, disk_model: VMware Virtual S, units: sectors of 1 * 512 512 bytes, logical_sector_size: 512, physical_sector_size: 512, min_io_size: 512, optimal_io_size: 512, disk_label_type: dos, disk_identifier: 0x3719ef0f, partitions: [ {device: /dev/sda1, boot: true, start: 2048, end: 39942143, sectors: 39940096, size: 19G, id: 83, type: Linux}, {device: /dev/sda2, boot: false, start: 39944190, end: 41940991, sectors: 1996802, size: 975M, id: 5, type: Extended}, {device: /dev/sda5, boot: false, start: 39944192, end: 41940991, sectors: 1996800, size: 975M, id: 82, type: Linux swap / Solaris} ] } ]注意现代格式的特点Disk ...:行以sectors结尾时解析器会提取disk_size、bytes、sectors三个字段*引导标记被转换为布尔值boot: true。4.2 旧版 util-linux 格式柱面/磁头输出CentOS 7.7 的sfdisk -l输出是旧式 CHS 格式见 tests/fixtures/centos-7.7/sfdisk-l.outDisk /dev/sda: 2610 cylinders, 255 heads, 63 sectors/track Units: cylinders of 8225280 bytes, blocks of 1024 bytes, counting from 0 Device Boot Start End #cyls #blocks Id System /dev/sda1 * 0 130- 131- 1048576 83 Linux /dev/sda2 130 2610- 2481- 19921920 8e Linux LVM /dev/sda3 0 - 0 0 0 Empty /dev/sda4 0 - 0 0 0 Empty文档中的示例展示了对应的解析结果[ { disk: /dev/sda, cylinders: 2610, heads: 255, sectors_per_track: 63, units: cylinders of 8225280 bytes, blocks of 1024 bytes, ..., partitions: [ {device: /dev/sda1, boot: true, start: 0, end: 130, cyls: 131, blocks: 1048576, id: 83, system: Linux}, {device: /dev/sda2, boot: false, start: 130, end: 2610, cyls: 2481, blocks: 19921920, id: 8e, system: Linux LVM}, {device: /dev/sda3, boot: false, start: 0, end: null, cyls: 0, blocks: 0, id: 0, system: Empty}, {device: /dev/sda4, boot: false, start: 0, end: null, cyls: 0, blocks: 0, id: 0, system: Empty} ] }, {disk: /dev/mapper/centos-root, cylinders: 2218, heads: 255, sectors_per_track: 63}, {disk: /dev/mapper/centos-swap, cylinders: 261, heads: 255, sectors_per_track: 63} ]值得注意的细节旧格式中Start列的0、End列的130-、#cyls列的131-这类带/-后缀的近似值在结构化输出中会被剥离符号并转换为整数start: 0、end: 130、cyls: 131。这正是源码_process中entry[key].replace(-, )处理逻辑的效果见 jc/parsers/sfdisk.py。无分区表的磁盘如/dev/mapper/centos-root只输出磁盘级字段partitions字段不存在这在多磁盘场景下是常见形态测试用例 tests/fixtures/centos-7.7/sfdisk-l-multi.out 专门覆盖了多磁盘混合输出。4.3 未分区空间sfdisk -Fsfdisk -F用于查看磁盘上尚未被分区占用的空间其输出行以Unpartitioned space开头。Debian 10 的示例见 tests/fixtures/debian10/sfdisk-F.outUnpartitioned space /dev/sda: 0 B, 0 bytes, 0 sectors Units: sectors of 1 * 512 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes解析结果对应 tests/fixtures/debian10/sfdisk-F.json[ { disk: /dev/sda, free_disk_size: 0 B, free_bytes: 0, free_sectors: 0, units: sectors of 1 * 512 512 bytes, logical_sector_size: 512, physical_sector_size: 512 } ]从源码看Unpartitioned space行会被拆分为disk、free_disk_size、free_bytes、free_sectors四个字段并且磁盘名称通过fields[2]取得。4.4 已弃用的-d选项sfdisk -d输出的是可回放的分区定义脚本以# partition table of /dev/sda开头仅存在于旧版 util-linux。其解析结果中size字段为整数源码中对size做了isnumeric()判断后转换为 intboot通过bootable关键字识别# partition table of /dev/sda unit: sectors /dev/sda1 : start 2048, size 2097152, Id83, bootable /dev/sda2 : start 2099200, size 39843840, Id8e对应测试位于 tests/fixtures/centos-7.7/sfdisk-d.out解析后/dev/sda1的boot为truesize为整数2097152。五、raw 模式保留原始字符串加-rraw参数时解析器跳过类型转换直接输出从文本中提取的原始字符串。以旧格式为例sfdisk -l | jc --sfdisk -p -r输出中cylinders为2610字符串、boot为*或null、start为0、end为130-、cyls为131-保留文本原始形态见文档中的 raw 示例。这在需要保留单位后缀、符号信息或做进一步自定义处理时非常有用。raw 模式与处理模式的差异在源码中体现在parse()末尾if raw: return raw_output else: return _process(raw_output)即 raw 模式返回状态机提取的原始字典列表处理模式则经_process完成 int / bool 转换。六、源码实现原理一行一行地状态机解析6.1 多版本输出格式识别parse() 的主体是一个按行遍历的状态机通过行前缀识别不同信息段# partition table of→ 进入已弃用的-d模式option dDisk且包含sectors/track→ 旧版 CHS 格式cylinders/heads/sectors_per_trackDisk且以sectors结尾 → util-linux v2.32.0 现代格式disk_size/bytes/sectorsDisk model:/Sector size (logical/physical):/I/O size (minimum/optimal):/Disklabel type:/Disk identifier:/Units:→ 对应元数据字段Unpartitioned space→-F未分区空间表头行同时含Start、End与Sectors或Device→ 进入分区表段section partitions并利用表头自动确定列名6.2 分区表解析复用通用工具分区数据段收集后交由jc.parsers.universal.sparse_table_parse()解析为“稀疏表”允许单元格为空的表格这也是为什么system/type等列名会随表头变化的原因。6.3 类型转换与清洗_process()见 jc/parsers/sfdisk.py统一执行整数转换cylinders、heads、sectors_per_track、start、end、cyls、mib、blocks、sectors、bytes、logical_sector_size、physical_sector_size、min_io_size、optimal_io_size、free_bytes、free_sectors转换前先剔除-符号处理130-这类近似值布尔转换boot将*标记转为True特殊处理分区size字段仅当内容为纯数字时才转为整数即-d输出场景。七、测试与验证解析器的正确性由 tests/test_sfdisk.py 中的单元测试保障测试输入/期望输出成对存放于 fixtures 目录多磁盘、单磁盘的-l输出tests/fixtures/centos-7.7/、tests/fixtures/debian10/sfdisk-l*.out/.json-d及多磁盘-dtests/fixtures/centos-7.7/sfdisk-d*.out/.json-uB/-uM/-uS单位变体tests/fixtures/centos-7.7/sfdisk-lu{B,M,S}.out/.json-F未分区空间tests/fixtures/centos-8/sfdisk-F.*、tests/fixtures/debian10/sfdisk-F*.out/.json空输入parse(, quietTrue)返回[]test_sfdisk_nodata这些用例覆盖了 CentOS 7.7、CentOS 8、Debian 10 等发行版上的真实输出可作为理解解析行为差异的权威参考。八、注意事项与适用前提平台限制解析器声明兼容linux。在非 linux 平台调用parse()时会触发兼容性警告除非传入quietTrue这是 jc.utils.compatibility 的通用机制。版本差异-d及-uM/-uC/-uS/-uB仅适用于旧版 util-linux现代发行版util-linux v2.32.0请使用-l与-F。空分区旧格式中Empty分区的end为null、start/cyls/blocks为0处理脚本时需要注意判空。字段随表头变化system旧版与type新版字段名的差异来自输出表头编写下游逻辑时应两者兼容处理。组合使用解析结果可直接管道给jq做过滤统计例如提取所有可引导分区、汇总 LVM 分区数量、或对free_sectors为 0 的磁盘做未分区空间告警从而把sfdisk文本输出纳入自动化运维链路。赞分享开发工具【免费下载链接】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点击查看免费下载相关推荐OpenProject 如何按版本规划产品路线图RoadmapOpenProject 如何按版本规划产品路线图Roadmap OpenProject 的 Roadmap 是一个按版本Version汇总工作包Wo开发工具jc 解析器实战使用 jc --gpg 将 gpg --with-colons 输出转换为 JSONjc 解析器实战使用 jc gpg 将 gpg with colons 输出转换为 JSON 导读 本文介绍 jcJSON Convert项目中的 gpg开发工具jc 解析器实战指南用 jc --history 将 shell history 命令输出转换为 JSONjc 解析器实战指南用 jc history 将 shell history 命令输出转换为 JSON 本指南以 jc 开源项目中的 history 解析器文开发工具上一篇ToastFish终极指南3步上手Windows通知栏背单词神器下一篇NVIDIA Profile Inspector终极指南解锁显卡隐藏性能的完整教程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

OpenAI Agents SDK 工程笔记:lifecycle 钩子与生产禁区 2026/9/26 3:55:27

OpenAI Agents SDK 工程笔记:lifecycle 钩子与生产禁区

千笔-AIWritePaper https://www.aiwritepaper.com 多 Agent 最贵的失败往往不是「没打日志」,而是把 lifecycle 钩子当成鉴权层或业务审批:以为 on_tool_start 打了点就等于工具已授权,以为 on_agent_end 看到输出就等于副作用已安全落库。…

阅读更多 →
Nginx核心功能详解:反向代理、负载均衡与性能调优实践 2026/9/26 3:55:27

Nginx核心功能详解:反向代理、负载均衡与性能调优实践

做了这么多年后端和运维,我越来越觉得Nginx就是一套行走的架构课。不管是刚入门的新人,还是带过线上集群的老手,最终都会绕回同一件事:把 Nginx 的核心功能吃透。它不只是“一个 Web 服务器”,更是静态资源托管、反向代…

阅读更多 →
维普能过的8款降AI率工具打分实测 2026/9/26 3:55:27

维普能过的8款降AI率工具打分实测

维普系统升级后,AI生成文本检测成了论文盲审前的硬门槛。不少学生反馈"自己写的段落也被判AI",降AI率从可选项变成了必选项。花了三周时间,把市面上讨论度较高的8款降AI率工具逐个跑了一遍,用同一篇1.2万字的经管类论文…

阅读更多 →
Go 内存语义详解:Stack、Heap、Escape Analysis 2026/9/26 3:55:27

Go 内存语义详解:Stack、Heap、Escape Analysis

Go 内存语义详解:Stack、Heap、Escape Analysis内存分配是 Go 的"暗物质"。理解 stack vs heap 与逃逸分析,能让你避开 80% 性能坑。一、栈与堆的区别 栈:函数局部变量,函数结束自动回收 堆:需要 GC 回收 fu…

阅读更多 →
写论文别硬扛:7款省级期刊论文工具整理 2026/9/26 3:55:20

写论文别硬扛:7款省级期刊论文工具整理

省级期刊发表门槛逐年抬高,从选题立意到查重降重再到格式规范,每个环节都在消耗研究生的时间与耐心。投稿被拒后反复修改是常态,与其硬扛不如借助工具提效。下面整理7款省级期刊论文写作工具,按需取用。aibiye官网直达入口&#x…

阅读更多 →
华为腾讯阿里都盯上的生意:不造机器人,却想控制所有机器人? 2026/9/26 3:55:20

华为腾讯阿里都盯上的生意:不造机器人,却想控制所有机器人?

作者:Evin编辑:刘致呈审核:徐徐出品:互联网江湖从年初的春晚表演,到4月份人形机器人半程马拉松打破人类世界记录;从上个月世界机器人大会上,各路机器人开始比打螺丝、搬东西,到最近启…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉