开发工具【免费下载链接】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 项目中的流式解析器iostat_s展开讲解如何将 Linuxiostat命令的实时输出逐行转换为 JSON LinesCLI或可迭代的字典对象模块 API并深入剖析其源码实现、输出 Schema 与测试验证方式。读完本文你将掌握iostat | jc --iostat-s的完整用法、-r/-u/-qq等关键选项的作用理解流式解析与普通解析--iostat的区别并能基于源码证据解释解析器对avg-cpu与Device两种段落的不同处理逻辑。iostat_s面向持续输出的流式解析器在 docs/parsers/iostat_s.md 中jc.parsers.iostat_s被定义为 “JSON Convertiostatcommand output streaming parser”其核心特性是流式输出CLI 模式下输出 JSON Lines每行一个 JSON 对象而不是一次性输出整个 JSON 数组模块 APIparse()函数返回一个可迭代的生成器对象逐条产出字典适用场景iostat本身是周期性刷新输出的命令如iostat 1每秒输出一次流式解析允许管道下游逐行消费无需等待命令结束。对比普通解析器 docs/parsers/iostat.md两者 Schema 完全一致区别只在于iostat_s的parse()是生成器函数见 jc/parsers/iostat_s.py逐行产出字典而iostat的parse()一次性返回整个字典列表。注意iostat11 及以上版本自带 JSON 输出选项-o JSON但jc的解析器仍可用于旧版本或希望统一输出风格如追加type字段的场景。使用方式CLI 用法$ iostat | jc --iostat-s {percent_user:0.14,percent_nice:0.0,percent_system:0.16,...} {device:sda,tps:0.24,kb_read_s:5.28,kb_wrtn_s:1.1,...} ...每行是一条独立的 JSON 记录便于用jq等工具逐行过滤$ iostat | jc --iostat-s | jq -r select(.type device) | .device sda dm-0 dm-1原始输出模式-r$ iostat | jc --iostat-s -r {percent_user:0.14,percent_nice:0.00,percent_system:0.16...} {device:sda,tps:0.24,kb_read_s:5.28,kb_wrtn_s:1.10...} ...-rraw模式不做类型转换所有数值以字符串原样输出。默认模式下_process()会按字段类型将数值转换为float或int见下文“类型转换”。管道缓冲问题与 -u 选项文档特别提醒当把jc转换后的iostat输出继续管道给其他进程时可能看起来像是“卡住”了——这是因为iostat输出量太小无法快速填满操作系统的管道缓冲区pipe buffer。如果需要即时输出可加上-u选项来解除jc输出的缓冲。这与 jc 整体的“Unbuffering Output”机制一致可参考 docs/readme.md 中关于-u选项的说明。模块 API 用法import jc result jc.parse(iostat_s, iostat_command_output.splitlines()) for item in result: # do something print(item)模块调用时parse()的第一个参数是行文本的可迭代对象例如sys.stdin或str.splitlines()的结果返回值是可迭代的字典集合适合在 Python 脚本中做实时监控与告警。输出 Schema 详解iostat_s的输出对象包含两类记录由type字段区分字段类型说明typestring记录类型cpu或devicepercent_user/percent_nice/percent_system/percent_iowait/percent_steal/percent_idlefloatCPU 使用率各项来自avg-cpu:段落devicestring块设备名来自Device:段落tpsfloat每秒传输次数kb_read_s/kb_wrtn_sfloat每秒读写 KBmb_read_s/mb_wrtn_sfloat每秒读写 MB-m输出kb_read/kb_wrtn/mb_read/mb_wrtninteger累计读写总量kb_dscd/mb_dscdinteger丢弃的读写总量新版本 iostat 字段rrqm_s/wrqm_sfloat每秒合并的读/写请求数-x输出r_s/w_sfloat每秒实际读/写次数rmb_s/rkb_s/wmb_s/wkb_sfloat每秒读写数据量MB/KB 两种单位avgrq_sz/avgqu_szfloat平均请求大小 / 平均队列长度await/r_await/w_awaitfloat平均服务时间与读写等待时间svctmfloat平均服务时间aqu_szfloat平均队列大小-y等扩展输出rareq_sz/wareq_szfloat平均读写请求大小d_s/dkb_s/dmb_s/drqm_s/percent_drqm/d_await/dareq_szfloat丢弃discard相关统计f_s/f_awaitfloatflush 相关统计较新内核的 iostat 扩展字段kb_dscd_s/mb_dscd_sfloat每秒丢弃数据量percent_utilfloat设备利用率%utilpercent_rrqm/percent_wrqmfloat合并读/写请求百分比上表是文档中 Schema 的完整继承其中大量扩展字段d_*、f_*、aqu_sz等只有在 iostat 输出包含对应列如-x扩展统计、较新内核新增列时才会出现在结果中——因为解析器是基于实际出现的表头动态构建字段的见下文“解析原理”。_jc_meta 元数据对象仅当使用-qqignore_exceptionsTrue时每条输出才会附加_jc_meta对象{ _jc_meta: { success: true } }当某一行解析失败时{ _jc_meta: { success: false, error: ParseError: ..., line: 无法解析的原始行内容 } }该机制的实现位于 jc/streaming.py 的add_jc_meta装饰器与stream_success/stream_error辅助函数以及 jc/streaming.py 的raise_or_yieldignore_exceptionsFalse时解析错误会直接抛出异常为True时则产出带_jc_meta错误信息的字典并继续处理后续行。parse() 函数签名与参数def parse(data, rawFalse, quietFalse, ignore_exceptionsFalse)参数类型说明dataiterable基于行的文本数据如sys.stdin或str.splitlines()结果rawboolean为True时输出未处理原始字符串结果不做类型转换quietboolean为True时抑制警告消息ignore_exceptionsboolean为True时忽略解析异常逐行继续处理CLI 对应-qq返回字典的可迭代对象Iterable of Dictionaries。从源码看jc/parsers/iostat_s.pyparse()首先调用jc.utils.compatibility()做平台兼容性检查再调用streaming_input_type_check()校验输入是“非字符串的可迭代对象”见 jc/streaming.py循环内对每一行调用streaming_line_input_type_check()校验其为字符串随后进入段落识别与解析逻辑。解析原理从源码看核心实现段落识别与表头归一化解析器维护一个section状态cpu或device通过行首关键字切换遇到avg-cpu:开头行 →section cpu将该行作为表头遇到Device开头行 →section device同样作为表头以Linux开头系统信息行或空行直接跳过其余数据行与当前段落表头配对构造输出字典。表头归一化由_normalize_headers()完成jc/parsers/iostat_s.pydef _normalize_headers(line): return line.replace(%, percent_).replace(/, _).replace(-, _).lower()即%user→percent_userr/s→r_savgqu-sz→avgqu_sz这解释了 Schema 中percent_*、*_s、*_sz等字段命名规律的来源。由于表头是动态生成的iostat 输出哪些列JSON 中就出现哪些字段因此上述 Schema 是“全集”而非“必集”。复用 universal 解析器构造记录_create_obj_list()调用jc.parsers.universal.simple_table_parse()将“表头行 数据行”解析为字典列表并统一为每条记录打上type标签cpu或devicedef _create_obj_list(section_list, section_name): output_list jc.parsers.universal.simple_table_parse(section_list) for item in output_list: item[type] section_name return output_list因此每行iostat输出都会立即产出一条带type字段的记录——这正是流式解析能做到“来一行、出一行”的关键。类型转换_process()jc/parsers/iostat_s.py在非 raw 模式下将字段按类型白名单转换int_listkb_read、mb_read、kb_wrtn、mb_wrtn、kb_dscd、mb_dscd→jc.utils.convert_to_int()float_list其余数值字段含percent_*、*_s、*_sz、*_await等 40 个→jc.utils.convert_to_float()从源码结构看数值转换完全由字段名驱动凡是不在白名单中的字段如device、type保持字符串原样。真实输出示例基于仓库 fixture仓库测试夹具tests/fixtures/centos-7.7/iostat.out是 CentOS 7.7 的默认iostat输出对应流式转换结果tests/fixtures/centos-7.7/iostat-streaming.json输入节选 avg-cpu: %user %nice %system %iowait %steal %idle 0.14 0.00 0.16 0.00 0.00 99.70 Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn sda 0.24 5.28 1.10 203305 42368 输出JSON Lines {percent_user:0.14,percent_nice:0.0,percent_system:0.16,percent_iowait:0.0,percent_steal:0.0,percent_idle:99.7,type:cpu} {device:sda,tps:0.24,kb_read_s:5.28,kb_wrtn_s:1.1,kb_read:203305,kb_wrtn:42368,type:device} {device:dm-0,tps:0.25,kb_read_s:4.42,kb_wrtn_s:1.05,kb_read:170325,kb_wrtn:40299,type:device} {device:dm-1,tps:0.0,kb_read_s:0.06,kb_wrtn_s:0.0,kb_read:2204,kb_wrtn:0,type:device}注意输出中的kb_read_s由输入kB_read/s归一化而来kb_read为整数其余为浮点数——与 Schema 定义一一对应。对于-mxMB 单位 扩展统计输出夹具tests/fixtures/centos-7.7/iostat-mx.out的转换结果tests/fixtures/centos-7.7/iostat-mx-streaming.json展示了rrqm_s、wrqm_s、r_s、w_s、rmb_s、wmb_s、avgrq_sz、avgqu_sz、await、r_await、w_await、svctm、percent_util等扩展字段的完整映射。测试验证如何保证解析正确性流式解析器的正确性由 tests/test_iostat_s.py 覆盖其测试矩阵包括多个发行版与版本CentOS 7.7、Ubuntu 18.04、Ubuntu 20.10多种 iostat 参数组合默认、-mMB 单位、-x扩展统计、-mx组合、iostat 1每秒刷新一次验证流式持续输出边界情况空输入返回空列表test_iostat_empty_dir非 iostat 数据抛出ParseErrortest_iostat_raise_exception。夹具使用方式见测试文件头注释$ cat iostat.out | jc --iostat-s | jello -c iostat-streaming.json即通过jcCLI 加jello -c生成紧凑 JSON 作为期望输出再在测试中断言parse()的结果与之完全相等。这些 fixture 位于 tests/fixtures/centos-7.7、tests/fixtures/ubuntu-18.04、tests/fixtures/ubuntu-20.10 目录是理解解析器行为最直接的素材。解析器元信息与兼容性在 jc/parsers/iostat_s.py 的info类中记录了元信息版本1.3作者Kelly Brazilkellyjonbrazilgmail.com兼容平台linuxcompatible [linux]标签command解析命令行输出流式标志streaming True表明该解析器属于流式解析器家族行为与 docs/streaming.md 中描述的流式机制一致由于iostat在不同发行版/内核版本下输出列存在差异解析器仅声明兼容 Linux使用前可先确认本机iostat输出格式是否与上述 fixture 形态一致。常见使用模式小结实时监控单设备吞吐iostat -x 1 | jc --iostat-s | jq -c select(.devicesda)配合-u获得即时输出Python 脚本持续采集模块 API 直接迭代parse()返回值逐条处理type cpu与type device记录容错处理脏数据添加-qq让解析器跳过无法解析的行并通过_jc_meta.error记录错误原因与原始行与普通解析器配合若希望一次性拿到完整数组如导入数据分析工具改用 docs/parsers/iostat.md 对应的--iostat即可两者 Schema 一致可无缝切换。赞分享开发工具【免费下载链接】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点击查看免费下载相关推荐3个技巧让你掌握Deceive新手也能快速上手的游戏隐身完整指南3个技巧让你掌握Deceive新手也能快速上手的游戏隐身完整指南 你是否曾在《英雄联盟》排位赛的关键时刻被好友的邀请弹窗打断是否在《无畏契约》训练时希望有个开发工具jc 的 --mpstat-s 流式解析器把 Linux mpstat 输出逐行转成 JSON Linesjc 的 mpstat s 流式解析器把 Linux mpstat 输出逐行转成 JSON Lines 本篇围绕 docs/parsers/mpstat_s.开发工具jc 流式解析器 ping_s 实战将 ping / ping6 输出实时转换为 JSON Linesjc 流式解析器 ping_s 实战将 ping / ping6 输出实时转换为 JSON Lines jcJSON Convert提供了流式strea开发工具上一篇CANN ops-transformer 稀疏注意力梯度元数据算子 SparseLightningIndexerKLLossGradMetadata 实战指南下一篇RuoYi AI性能优化技术解析WebSocket并发与SSE流控实现创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
企业数字化 ERP 产品动态
相关推荐
Godot-MCP 开发者指南:如何为自己的项目扩展自定义 MCP 命令 Godot-MCP 开发者指南:如何为自己的项目扩展自定义 MCP 命令 【免费下载链接】Godot-MCP An MCP for Godot that lets you create and edit games in the Godot game engine with tools like Claude 项目地址: https://gitcode.com/gh_mirrors/god/Godot-MCP … · 2026/9/25 2:57:53
RK3128电视盒子卡顿?通刷固件与性能优化实战指南 /* 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 2:57:53
MFC现代化UI实战:UIShop换肤与QQ式界面开发 简介:本资源是一套面向Windows桌面应用开发者的MFC专业GUI开发工具包,专为中高级C开发者设计,解决传统MFC界面开发效率低、现代化UI(如QQ/360风格)实现困难、换肤功能集成复杂等痛点。工具包含可视化所见即所得设计工具… · 2026/9/25 2:57:53
Easy-Vibe 编译原理入门:从词法分析到 JIT 的完整编译流水线 教程文档 【免费下载链接】easy-vibe 从 0 到 1 学会 vibe coding,项目制学习 项目地址: https://gitcode.com/datawhalechina/easy-vibe 点击查看 免费下载 当你按下"运行"按钮,代码是怎么变成屏幕上结果的? 你写的每… · 2026/9/25 3:30:36
Java工业物联网IOT驱动包:统一Modbus-TCP、Bacnet与OPC-UA协议接入 简介:这份基于Java的物联网IOT通用驱动包设计源码,面向中高级Java开发者与系统集成商,解决Modbus-TCP、Bacnet、OPC-UA等多协议设备接入问题,封装为SDK形式,可直接嵌入业务系统。压缩包共76个文件,约1.73MB… · 2026/9/25 3:30:36
云原生健康监测系统落地实战:设备接入、实时告警与临床可用性 /* 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 3:30:30
创维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