开发工具【免费下载链接】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 仓库的 lsblk 解析器文档 与对应源码 jc/parsers/lsblk.py 展开讲解如何将lsblk的块设备/分区/挂载点树形表格输出转换为可被 jq、Python 或任何 JSON 消费工具处理的字典列表涵盖 CLI 与 Python 模块两种调用方式、完整输出 Schema、原始raw与处理后的输出差异、多挂载点合并规则以及解析器底层的稀疏表格解析、树形字符清理与类型转换机制。读完本文你可以把任意发行版的lsblk输出默认列或-o KNAME,FSTYPE,...全列模式直接接入自动化脚本并通过仓库测试夹具验证解析结果。解析器概览与调用方式jc 将lsblk输出解析为字典列表每个字典对应一行设备磁盘、分区、LVM 逻辑卷、ROM 等。解析器元数据定义在 jc/parsers/lsblk.py 的info类中版本1.10描述lsblk command parser兼容性仅linuxcompatible [linux]魔命令lsblk因此jc lsblk会自动调用系统lsblk并解析其输出CLI 方式# 管道方式先运行 lsblk再交给 jc $ lsblk | jc --lsblk # 或 jc 直接以魔命令方式执行 lsblk 并解析 $ jc lsblkPython 模块方式import jc result jc.parse(lsblk, lsblk_command_output)parse()函数签名与参数如下见 jc/parsers/lsblk.py参数类型说明datastring待解析的lsblk文本输出rawboolean为True时返回未经类型处理的原始结构化数据对应 CLI 的-r选项quietboolean为True时抑制兼容性检查等警告信息返回值List of Dictionaries即原始或已按 Schema 处理过的结构化数据。输出 Schema 与字段说明Schema 由默认列NAME、MAJ:MIN、RM、SIZE、RO、TYPE、MOUNTPOINT与通过lsblk -o ...追加的扩展列共同组成。注意扩展列字段只有在lsblk命令确实输出了对应列时才会出现在结果字典中——解析器只解析表头实际存在的列不会凭空补全。完整字段表继承自 docs/parsers/lsblk.md 的 Schema并结合源码类型转换逻辑标注字段类型来源列说明namestringNAME设备名树形前缀字符已被剥离maj_minstringMAJ:MIN主:次设备号rmbooleanRM是否可移除0/1转为false/truesizestringSIZE人类可读大小size_bytesinteger—派生由size自动换算的字节数robooleanRO是否只读typestringTYPEdisk/part/lvm/rom等mountpointstring/nullMOUNTPOINT单一挂载点无挂载时为nullmountpointsstring[]MOUNTPOINTS多挂载点列名下的挂载点数组knamestringKNAME内核设备名fstypestring/nullFSTYPE文件系统类型labelstring/nullLABEL卷标签uuidstring/nullUUID文件系统 UUIDpartlabelstring/nullPARTLABEL分区标签partuuidstring/nullPARTUUID分区 UUIDraintegerRA预读值modelstring/nullMODEL设备型号serialstring/nullSERIAL序列号statestring/nullSTATE设备状态owner/group/modestringOWNER / GROUP / MODE设备节点属主、组与权限alignmentintegerALIGNMENT对齐min_io/opt_iointegerMIN-IO / OPT-IO最小/最优 I/O 大小phy_sec/log_secintegerPHY-SEC / LOG-SEC物理/逻辑扇区大小rotabooleanROTA是否为旋转介质schedstringSCHEDI/O 调度器rq_sizeintegerRQ-SIZE请求队列深度disc_alnintegerDISC-ALN块丢弃对齐disc_granstringDISC-GRAN块丢弃粒度disc_gran_bytesinteger—派生丢弃粒度字节数disc_maxstringDISC-MAX最大块丢弃长度disc_max_bytesinteger—派生最大块丢弃字节数disc_zerobooleanDISC-ZERO丢弃是否保证清零wsamestringWSAME相同写长度wsame_bytesinteger—派生相同写长度字节数wwnstring/nullWWN全局唯一名称randbooleanRAND是否随机存取设备pknamestring/nullPKNAME父设备名hctlstring/nullHCTL主机-通道-目标-LUNtranstring/nullTRAN传输类型如spi、satarevstring/nullREV固件/接口版本vendorstring/nullVENDOR厂商默认列输出示例以下示例直接取自仓库测试夹具 tests/fixtures/centos-7.7/lsblk.out是 CentOS 7.7 上lsblk的真实输出含 LVM 逻辑卷与树形前缀NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 20G 0 disk ├─sda1 8:1 0 1G 0 part /boot └─sda2 8:2 0 19G 0 part ├─centos-root 253:0 0 17G 0 lvm / └─centos-swap 253:1 0 2G 0 lvm [SWAP] sr0 11:0 1 1024M 0 rom执行lsblk | jc --lsblk后得到 tests/fixtures/centos-7.7/lsblk.json 对应的结构化结果此处为格式化后节选完整结果即该夹具文件[ {name: sda, maj_min: 8:0, rm: false, size: 20G, ro: false, type: disk, mountpoint: null, size_bytes: 21474836480}, {name: sda1, maj_min: 8:1, rm: false, size: 1G, ro: false, type: part, mountpoint: /boot, size_bytes: 1073741824}, {name: centos-root, maj_min: 253:0, rm: false, size: 17G, ro: false, type: lvm, mountpoint: /, size_bytes: 18253611008}, {name: sr0, maj_min: 11:0, rm: true, size: 1024M, ro: false, type: rom, mountpoint: null, size_bytes: 1073741312} ]注意几个处理细节RM列的0/1已被转换为布尔值false/trueSIZE的20G被换算为size_bytes: 2147483648020 × 1024³树形前缀├─、└─已从name中剥离centos-root而非├─centos-root[SWAP]这类非路径挂载点保留在mountpoint字段中原样输出。全列模式追加 27 个扩展列原文档给出的全列命令是解析能力的完整边界继承自 docs/parsers/lsblk.md 的 Examples$ lsblk -o KNAME,FSTYPE,LABEL,UUID,PARTLABEL,PARTUUID,RA,MODEL,SERIAL,\ STATE,OWNER,GROUP,MODE,ALIGNMENT,MIN-IO,OPT-IO,PHY-SEC,LOG-SEC,ROTA,\ SCHED,RQ-SIZE,DISC-ALN,DISC-GRAN,DISC-MAX,DISC-ZERO,WSAME,WWN,RAND,\ PKNAME,HCTL,TRAN,REV,VENDOR | jc --lsblk -p该命令输出的每个设备条目将额外包含kname、fstype、uuid、ra、model、sched直至vendor等全部扩展字段。仓库中全列模式的真实测试数据见 tests/fixtures/ubuntu-18.04/lsblk-allcols.out 与期望输出 tests/fixtures/ubuntu-18.04/lsblk-allcols.jsonCentOS 7.7 版本同名夹具位于tests/fixtures/centos-7.7/下。文档示例中全列输出的一个典型条目磁盘行{ name: sda, maj_min: 8:0, rm: false, size: 20G, size_bytes: 20000000000, ro: false, type: disk, mountpoint: null, kname: sda, fstype: null, uuid: null, partuuid: null, ra: 4096, model: VMware Virtual S, state: running, owner: root, group: disk, mode: brw-rw----, alignment: 0, min_io: 512, phy_sec: 512, log_sec: 512, rota: true, sched: deadline, rq_size: 128, disc_gran: 0B, disc_gran_bytes: 0, wsame: 32M, wsame_bytes: 32000000, hctl: 0:0:0:0, tran: spi, rev: 1.0, vendor: VMware, }而分区行sda1则展示了字段差异fstype为xfs、uuid为具体 GUID、pkname指向父设备sda同时model、hctl等仅磁盘层有效的字段为null。这种“有值/无值取决于设备层级”的模式正是lsblk输出稀疏性的体现也是解析器必须按列边界而非简单空格切分的原因。raw 模式-r与处理后输出的区别CLI 的-rraw选项对应parse()的rawTrue跳过_process()阶段返回原始字符串值。同一份全列输入在两种模式下的差异示例继承自原文档字段处理后默认raw-rrmfalse0rofalse0rotatrue1randtrue1disc_zerofalse0ra40964096alignment/min_io/phy_sec等整数字段0/5120/512size_bytes/disc_gran_bytes/disc_max_bytes/wsame_bytes3200000032000000始终保留值得注意字节数派生字段*_bytes即使使用-r也始终由convert_size_to_int()生成整数值——因为_process()中 size 换算与布尔/整数转换作用于同一次遍历而原始表格文本里并不存在这些列。若需要完全无加工的表格数据raw 模式是调试列对齐问题时的合适选择。源码级解析流程parse()的完整流程见 jc/parsers/lsblk.py分为四步1. 表头归一化cleandata[0] cleandata[0].lower() cleandata[0] cleandata[0].replace(:, _) cleandata[0] cleandata[0].replace(-, _)表头行被转小写并将:和-替换为_于是MAJ:MIN成为键maj_min、MIN-IO成为min_io、DISC-GRAN成为disc_gran。这一步决定了 Schema 中所有键名的拼写规则。2. 稀疏表格解析 sparse_table_parselsblk 表格的列间存在大量空单元格如磁盘行没有FSTYPE、分区行没有HCTL且MOUNTPOINTS列的数据可能含空格。若用简单的split()按空白切分会错位因此 jc 在 jc/parsers/universal.py 中提供了sparse_table_parse()其核心策略是将所有行右填充空格至最长行长度保证列边界稳定从表头行确定每一列的起始与结束字符位置header_spec_list见 jc/parsers/universal.py对每一数据行在这些列边界处插入不可见分隔符\u2063invisible separator选它是因为终端输出中几乎不会自然出现该字符随后按分隔符切分单元格内去除首尾空格空单元格映射为None。这意味着解析结果中的键集合严格等于表头列集合空单元格统一为null——这也解释了为什么同一台机器上磁盘行与分区行的 JSON 键值可空性不同而键的位置始终按列对齐。3. 多挂载点合并新版 util-linux 的lsblk使用MOUNTPOINTS复数列同一设备有多个挂载点时后续挂载点单独占一行且只有最后一列有值。解析器对这种“无name的续行”做了合并处理见 jc/parsers/lsblk.pyfor entry in raw_output: if entry[name]: if mountpoints in entry: if entry[mountpoints]: entry[mountpoints] [entry[mountpoints]] else: entry[mountpoints] [] new_list.append(entry) elif mountpoints in entry and entry[mountpoints]: new_list[-1][mountpoints].append(entry[mountpoints])规则是遇到带name的行即开启新条目并把已有挂载点初始化为单元素列表空则初始化为[]遇到只有mountpoints列有值的续行则追加到上一个条目的mountpoints数组中。tests/test_lsblk.py 中的test_lsblk_multiple_mountpoints用例完整验证了该逻辑——一个 LVM 卷almalinux-opt同时挂载到/var/lib/kafka和/opt-almalinux-opt 253:3 0 9017753600 0 lvm /var/lib/kafka /opt解析后得到{name: almalinux-opt, maj_min: 253:3, rm: false, size: 9017753600, ro: false, type: lvm, mountpoints: [/var/lib/kafka, /opt], size_bytes: 9017753600}若lsblk输出的是旧版单数MOUNTPOINT列则不存在续行合并逻辑字段直接为mountpoint字符串。4. 树形字符清理与类型转换树形前缀清理遍历每个条目的name剥离-、|-、├─、└─四种前缀jc/parsers/lsblk.py兼容 ASCII 与 Unicode 两种lsblk树形风格。随后在rawFalse时执行_process()做 Schema 定型见 jc/parsers/lsblk.pybool_list {rm, ro, rota, disc_zero, rand} int_list {ra, alignment, min_io, opt_io, phy_sec, log_sec, rq_size, disc_aln} size_list {size, disc_gran, disc_max, wsame}布尔列经jc.utils.convert_to_bool()把0/1以及可能的yes/no类值规范为false/true整数列经jc.utils.convert_to_int()转为 Pythonint尺寸列统一经jc.utils.convert_size_to_int(entry[key], posix_modeTrue)派生key _bytes字段因此SIZE20G得到size_bytes21474836480。测试与验证tests/test_lsblk.py 对解析器做了 6 组断言全部基于真实系统采集的夹具用例输入说明test_lsblk_nodata空字符串parse(, quietTrue)应返回[]test_lsblk_centos_7_7centos-7.7/lsblk.out默认列CentOS 7.7 真实输出test_lsblk_ubuntu_18_4ubuntu-18.04/lsblk.out默认列Ubuntu 18.04 真实输出test_lsblk_allcols_centos_7_7/..._ubuntu_18_4对应lsblk-allcols.out-o KNAME,...,VENDOR全列模式test_lsblk_multiple_mountpoints内嵌字符串MOUNTPOINTS多挂载点合并每组测试都将解析结果与同名.json期望文件做assertEqual全量比对可视为“解析输出 ↔ 真实命令输出”的回归基线。本地复现方式python -m pytest tests/test_lsblk.py -v兼容性与使用限制平台解析器info.compatible [linux]parse()开头会调用jc.utils.compatibility()检查当前平台非 Linux 系统上会发出警告可用quietTrue或 CLI 的-q抑制。列依赖表头解析器不硬编码任何列字段集合完全由输入表头决定。若lsblk因权限不足输出No devices found之类的非表格文本则jc.utils.has_data()判断为无数据并返回空列表。树形前缀仅识别-、|-、├─、└─四种两字符前缀lsblk --list这类无树形输出的格式同样可被正确解析无前缀可剥。大小换算*_bytes派生值采用posix_modeTrue换算1G 1024³与lsblk默认的 KiB/MiB/GiB 进制一致而非lsblk -b的十进制字节。总结jc 的 lsblk 解析器把lsblk的“人类友好树形表格”变成了机器友好的扁平字典列表——稀疏表格按列边界精确解析、多挂载点行合并为数组、树形字符剥离、布尔/整数/字节数三类自动转换全部可用仓库中的夹具与测试用例复现验证。将其接入脚本的典型形态即lsblk -o KNAME,FSTYPE,UUID | jc --lsblk | jq .[] | select(.typedisk) | .name之类的设备清单提取。赞分享开发工具【免费下载链接】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点击查看免费下载相关推荐fastfetch 内置的 Shell 补全脚本怎么用为 bash/zsh/fish 启用 tab 补全fastfetch 内置的 Shell 补全脚本怎么用为 bash/zsh/fish 启用 tab 补全 fastfetch 仓库自带三份 shell 补全脚开发工具Laravel Sail多服务配置技巧Redis、Memcached、RabbitMQ集成Laravel Sail多服务配置技巧Redis、Memcached、RabbitMQ集成 Laravel Sail是Laravel官方提供的Docker开发开发工具zip.js Zip64深度解析突破4GB限制处理超大文件zip.js Zip64深度解析突破4GB限制处理超大文件 zip.js是一款功能强大的JavaScript库支持多核心压缩、压缩流、Zip64格式、分卷文上一篇终极指南如何在终端中实现跨平台剪贴板功能下一篇Live Server终极指南快速搭建前端实时开发服务器创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
