开发工具【免费下载链接】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点击查看免费下载jcJSON Convert是面向命令行工具输出、文件类型和通用字符串的 CLI 与 Python 库能将ethtool这类命令的自然语言输出转换为 JSON、YAML 或 Python 字典方便直接交给jq或自动化脚本处理。本篇指南以 docs/parsers/ethtool.md 为核心完整讲解 jc 的ethtool解析器包括标准ethtool interface输出与ethtool --module-info interface光模块信息两种解析模式、完整的输出 Schema、CLI 与 Python 模块两种调用方式并结合源码与测试夹具说明布尔转换、单位换算、多行字段归并等底层实现细节。阅读完成后你将能够把网卡状态、协商速率、光模块诊断信息等数据一键转成结构化 JSON用于监控脚本、资产管理或故障排查。一、解析器概述与适用场景jc.parsers.ethtool是 jc 内置的命令输出解析器负责解析 Linux 下ethtool命令的输出官方描述为jc - JSON Convertethtoolcommand output parserSupports standardethtooloutput and the--module-infooption.也就是说该解析器同时支持两种输入形态标准输出ethtool interface返回的网卡设置摘要速率、双工、端口类型、自协商、Wake-on-LAN、链路状态等模块信息ethtool --module-info interface返回的可插拔光模块SFP/GBIC 等EEPROM 信息标识符、连接器、传输类型、厂商信息、长度等级等。从源码元数据jc/parsers/ethtool.py 中info类可以看到class info(): Provides parser metadata (version, author, etc.) version 1.1 description ethtool command parser author Kelly Brazil author_email kellyjonbrazilgmail.com compatible [linux] tags [command] magic_commands [ethtool]其中compatible [linux]表示该解析器仅面向 Linux 平台ethtool本身也是 Linux 专属工具跨平台使用macOS/Windows时 jc 会输出兼容性警告。二、两种调用方式CLI 与 Python 模块2.1 命令行用法管道方式推荐与jq等工具无缝衔接$ ethtool interface | jc --ethtool $ ethtool --module-info interface | jc --ethtooljc 直接接管参数方式$ jc ethtool interface $ jc ethtool --module-info interface加上-p参数可以输出美化后的 JSON便于人工阅读默认输出为紧凑 JSON。示例$ ethtool enp0s3 | jc --ethtool -p2.2 Python 模块用法在 Python 脚本中通过jc.parse()传入解析器名与原始文本即可import jc result jc.parse(ethtool, ethtool_command_output)result是符合下述 Schema 的字典配合rawTrue时返回未加工的原始字典。底层入口函数定义见 jc/parsers/ethtool.pydef parse(data: str, raw: bool False, quiet: bool False) - JSONDictType: Main text parsing function Parameters: data: (string) text data to parse raw: (boolean) unprocessed output if True quiet: (boolean) suppress warning messages if True Returns: List of Dictionaries. Raw or processed structured data. 三个参数的作用参数类型含义datastr待解析的ethtool命令输出文本rawbool为True时返回未经类型转换的原始字典保留原字符串值quietbool为True时抑制兼容性等警告信息parse内部会先调用jc.utils.compatibility()校验平台兼容性、jc.utils.input_type_check()校验输入类型再根据首行内容自动分派到两种解析器输入以Settings for开头 → 走_parse_default()标准输出输入以Identifier开头 → 走_parse_module_info()模块信息。这一自动分派逻辑意味着同一入口函数可处理两种输出无需手动指定模式。三、标准输出ethtool interface的 Schema 与示例3.1 完整输出 Schema原文档给出的标准输出 Schema 如下字段名已由源码jc.utils.normalize_key()归一化为小写、下划线分隔风格{ name: string, supported_ports: [ string ], supported_link_modes: [ string ], supported_pause_frame_use: string, supports_auto_negotiation: boolean, supported_fec_modes: [ string ], advertised_link_modes: [ string ], advertised_pause_frame_use: boolean, advertised_auto_negotiation: boolean, advertised_fec_modes: [ string ], speed: string, speed_bps: integer, duplex: string, auto_negotiation: boolean, port: string, phyad: string, mdi_x: string, transceiver: string, supports_wake_on: string, wake_on: string, current_message_level: [ string ], link_detected: boolean, identifier: string, extended_identifier: string, connector: string, transceiver_codes: string, transceiver_type: [ string ], encoding: string, br_nominal: string, rate_identifier: string, length_smf_km: string, length_smf: string, length_50um: string, length_62_5um: string, length_copper: string, length_om3: string, passive_cu_cmplnce: string, vendor_name: string, vendor_oui: string, vendor_pn: string, vendor_rev: string, option_values: string, br_margin_max: string, br_margin_min: string }需要特别说明两点Schema 前半部分name至link_detected来自标准ethtool interface输出后半部分identifier至br_margin_min来自--module-info输出。两者共用同一个输出字典。单位字段会被自动转换为整数或浮点数如speed→speed_bps因此原文档明确指出many units fields are converted to integers and floats when detected. Use raw output for the original string values.——需要原始字符串时请使用rawTrue。3.2 标准输出示例原文档示例真实命令ethtool enp0s3 | jc --ethtool -p{ name: enp0s3, supported_pause_frame_use: No, supports_auto_negotiation: true, supported_fec_modes: Not reported, advertised_pause_frame_use: false, advertised_auto_negotiation: true, advertised_fec_modes: Not reported, speed: 1000Mb/s, duplex: Full, port: Twisted Pair, phyad: 0, transceiver: internal, auto_negotiation: false, mdi_x: off (auto), supports_wake_on: umbg, wake_on: d, link_detected: true, supported_ports: [ TP ], supported_link_modes: [ 10baseT/Half, 10baseT/Full, 100baseT/Half, 100baseT/Full, 1000baseT/Full ], advertised_link_modes: [ 10baseT/Half, 10baseT/Full, 100baseT/Half, 100baseT/Full, 1000baseT/Full ], current_message_level: [ 0x00000007 (7), drv probe link ], speed_bps: 1000000000 }该示例对应的原始输入可在测试夹具 tests/fixtures/generic/ethtool--default1.out 中查看期望输出见 tests/fixtures/generic/ethtool--default1.json。注意几个关键转换Supports auto-negotiation: Yes→supports_auto_negotiation: trueAuto-negotiation: on→auto_negotiation: falseethtool原输出为 on但 jc 在示例环境中解析为false说明转换逻辑按 yes/on 等关键词判定且依赖实际设备状态Speed: 1000Mb/s→speed: 1000Mb/s的同时新增speed_bps: 1000000000Supported FEC modes: Not reported→supported_fec_modes: Not reported保持字符串原样。3.3 链接伙伴Link partner扩展字段除了原文档示例解析器还支持ethtool较新版本输出的 Link partner advertised 系列字段。测试夹具 tests/fixtures/generic/ethtool--link-partner-advertised-link-modes.out 展示了这类输入Link partner advertised link modes: 10baseT/Half 10baseT/Full 100baseT/Half 100baseT/Full Link partner advertised pause frame use: Symmetric Link partner advertised auto-negotiation: Yes Link partner advertised FEC modes: Not reported对应输出tests/fixtures/generic/ethtool--link-partner-advertised-link-modes.json中会生成link_partner_advertised_link_modes数组、link_partner_advertised_pause_frame_use、link_partner_advertised_auto_negotiation布尔、link_partner_advertised_fec_modes等字段可用于排查对端设备通告的速率能力。四、模块信息ethtool --module-info的 Schema 与示例4.1 模块信息示例原文档示例ethtool --module-info enp0s3 | jc --ethtool -p{ identifier: 0x03 (SFP), extended_identifier: 0x04 (GBIC/SFP defined by 2-wire interface ID), connector: 0x21 (Copper pigtail), transceiver_codes: 0x01 0x00 0x00 0x04 0x00 0x04 0x80 0xd5 0x00, transceiver_type: [ Infiniband: 1X Copper Passive, Ethernet: 1000BASE-CX, Passive Cable, FC: Twin Axial Pair (TW), FC: 1200 MBytes/sec, FC: 800 MBytes/sec, FC: 400 MBytes/sec, FC: 200 MBytes/sec, FC: 100 MBytes/sec ], encoding: 0x00 (unspecified), br_nominal: 10300MBd, rate_identifier: 0x00 (unspecified), length_smf_km: 0km, length_smf: 0m, length_50um: 0m, length_62_5um: 0m, length_copper: 2m, length_om3: 0m, passive_cu_cmplnce: 0x01 (SFF-8431 appendix E) [SFF-8472 rev10.4 only], vendor_name: UbiquitiNetworks, vendor_oui: 00:40:20, vendor_pn: UDC-2, vendor_rev: , option_values: 0x00 0x00, br_margin_max: 0%, br_margin_min: 0% }对应的原始输出夹具为 tests/fixtures/generic/ethtool--module-info.out期望 JSON 为 tests/fixtures/generic/ethtool--module-info.json。4.2 模块信息的关键特征多值字段自动归并为数组Transceiver type、Option等键在原始输出中重复出现多次每行一个值_parse_module_info()会将同键多次出现的值收集为列表如上面的transceiver_type数组空值字段保留为空字符串如Vendor rev无内容时输出vendor_rev: 原始十六进制文本保留transceiver_codes、option_values等仍为原始字符串便于对照 SFF-8472 规范解读。五、源码实现解析如何完成类型转换与单位换算5.1 布尔值归一化_process标准输出中的Yes/No/on/off等文本会被统一转换为布尔值。_process()中维护了一个布尔字段集合bool_list {supports_auto_negotiation, advertised_auto_negotiation, auto_negotiation, link_detected, advertised_pause_frame_use} for key in bool_list: if key in proc_data: proc_data[key] jc.utils.convert_to_bool(proc_data[key])convert_to_bool定义于 jc/utils.py对 yes/on 等关键词做宽松匹配。注意advertised_pause_frame_use这类字段在原始输出中可能是No或Symmetric等文本转换逻辑会对非肯定值返回false。5.2 速率换算speed→speed_bps解析器会为速率字段附加 bps 数值if speed in proc_data: proc_data[speed_bps] jc.utils.convert_size_to_int(proc_data[speed])convert_size_to_int同样位于 jc/utils.py负责把1000Mb/s这类带单位字符串换算为纯整数如1000000000这为脚本直接做数值比较、阈值判断提供了便利。5.3 模块信息中的单位拆分_process这是本解析器最有特色的部分。对于--module-info中带单位的诊断数值_process()会使用三个正则/后缀规则将单一字符串字段拆分并重命名为多个数值字段# 0.0468 mW / -13.30 dBm or -40.00 degrees C / -40.00 degrees F degrees_re re.compile(r(?Pdeg_c.*?) degrees C \/ (?Pdeg_f.*?) degrees F) power_re re.compile(r(?Ppow_mw.*?) mW \/ (?Ppow_dbm.*?) dBm)处理规则形如-40.00 degrees C / -40.00 degrees F的温度 → 拆成key_celsius与key_farenheit两个浮点字段形如0.8183 mW / -0.87 dBm的光功率 → 拆成key_mw与key_dbm两个浮点字段以V结尾如3.2995 V→ 生成key_v浮点字段以mA结尾如51.494 mA→ 生成key_ma浮点字段原字段会被删除只保留数值化字段。实际效果可参考测试夹具 tests/fixtures/generic/ethtool--module-info-convert-units.out包含光模块实时诊断与阈值数据与对应的期望输出 tests/fixtures/generic/ethtool--module-info-convert-units.json。该夹具覆盖了全部转换规则例如原始输出转换后字段Laser output power : 0.8183 mW / -0.87 dBmlaser_output_power_mw: 0.8183、laser_output_power_dbm: -0.87Module temperature : 34.99 degrees C / 94.99 degrees Fmodule_temperature_celsius: 34.99、module_temperature_farenheit: 94.99Module voltage : 3.2995 Vmodule_voltage_v: 3.2995Laser bias current : 51.494 mAlaser_bias_current_ma: 51.494Laser rx power low warning threshold : 0.0468 mW / -13.30 dBmlaser_rx_power_low_warning_threshold_mw: 0.0468、..._dbm: -13.3这意味着在--module-info模式下光模块的温度、电压、偏置电流、收发功率及其告警/警告阈值全部成为可直接参与运算的浮点数非常适合对接监控告警系统。注意源码中 farenheit 为拼写保留输出字段名即为*_farenheit。六、文本解析的底层逻辑6.1 标准输出_parse_default()该函数逐行扫描文本核心机制包括首行识别Settings for enp0s3:中的接口名被提取为name列表字段的多行归并Supported link modes、Advertised link modes、Supported FEC modes等字段可能换行续写见夹具 tests/fixtures/generic/ethtool--default1.out 中缩进续行解析器通过mode状态变量记住当前正在收集的列表后续缩进行追加到对应列表直到遇到新的非缩进行才切换状态Not reported处理当列表字段值为Not reported时输出保持字符串原样若后续收集到实际值则以数组形式输出键名归一化PHYAD、MDI-X、Wake-on等原始键经jc.utils.normalize_key()转为phyad、mdi_x、wake_on等统一风格。6.2 模块信息_parse_module_info()该函数同样逐行按key: value切分但核心是连续重复键的合并当新一行的键与上一行相同时如多行Transceiver type、Option值被追加到临时列表multi_value最终len(multi_value) 1的键以数组输出单值键以字符串输出空键以空字符串输出。最后删除可能的空键。6.3 空输入与无数据场景parse()通过jc.utils.has_data()判断输入是否为空测试文件 tests/test_ethtool.py 中的test_ethtool_nodata用例验证了无数据输入时返回{}的行为。完整的标准测试流程为test_ethtool_all_fixtures它会遍历tests/fixtures/generic/下全部ethtool--*.out夹具并与对应.json期望结果比对。七、注意事项与最佳实践平台限制解析器仅声明兼容 Linuxcompatible [linux]在其他平台运行会产生兼容性警告可使用quietTrue抑制但结果可信度取决于是否有真实ethtool输出。原始值保留涉及单位换算的字段速率、温度、功率、电压、电流在默认输出中会被数值化若需保留1000Mb/s、0.8183 mW / -0.87 dBm这类原始字符串请使用rawTrue。布尔与枚举文本supports_auto_negotiation、link_detected等字段是布尔值而supported_pause_frame_use、supported_fec_modes等可能为Not reported、Symmetric等文本比较时需区分类型。典型自动化组合将ethtool输出转成 JSON 后可直接配合jq过滤如ethtool enp0s3 | jc --ethtool | jq .speed_bps或用于 Python 脚本批量巡检多网卡速率、光模块温度与告警标志。八、延伸阅读解析器完整源码jc/parsers/ethtool.py解析器文档docs/parsers/ethtool.md单元测试tests/test_ethtool.py测试夹具目录标准输出、链接伙伴、模块信息、单位转换四类场景tests/fixtures/generic/ 下的ethtool--*.out与ethtool--*.json通用工具函数convert_to_bool、convert_size_to_int、normalize_key等jc/utils.py赞分享开发工具【免费下载链接】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点击查看免费下载相关推荐FCMAE框架如何提升ConvNeXt V2-Tiny-1K-224性能核心技术揭秘 FCMAE框架如何提升ConvNeXt V2 Tiny 1K 224性能核心技术揭秘 ConvNeXt V2 Tiny 1K 224作为新一代纯卷积神经开发工具jc 的 file 命令解析器将 file * 输出转换为结构化 JSONjc 的 file 命令解析器将 file 输出转换为结构化 JSON 导读 file 命令是 Linux / macOS 系统上最常用的文件类型探测工具但开发工具jc 解析 dmidecode将 Linux 硬件信息 DMI 输出转换为 JSON 的完整指南jc 解析 dmidecode将 Linux 硬件信息 DMI 输出转换为 JSON 的完整指南 导读 dmidecode 是 Linux 系统上读取 SMB开发工具上一篇TeslaMate数据安全终极指南7步加密API令牌与智能数据库备份策略下一篇Tempus Dominus 事件系统终极指南从监听事件到自定义事件开发创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
