ARTICLE DETAIL

资讯详情

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

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

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),仅供参考
返回列表