开发工具【免费下载链接】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项目中的ip_route解析器展开介绍如何将 Linuxip route命令的路由表输出转换为 JSON 结构化数据并深入解析其字段映射规则、parse()函数实现原理与测试验证方式。读完本文你将掌握jc --ip-route与jc.parse(ip_route, ...)两种调用方式理解每条路由记录中ip、via、dev、metric、proto、scope、src、status等字段的来源与类型转换逻辑并能在自动化脚本中直接用 jq 处理路由表信息。一、解析器概述与适用场景ip_route是 jc 内置的 Linux 命令输出解析器其定位为 ip routecommand parser。Linux 系统管理员经常使用ip route查看内核路由表但它的文本输出格式并不利于脚本消费——每行是一条路由包含目标网段、网关、出接口、路由协议、作用域、度量值等多个属性。jc 的ip_route解析器将每行拆解为独立的 JSON 对象从而使路由信息可以被jq、Python、监控脚本等标准化工具直接处理。从解析器元数据jc/parsers/ip_route.py 中的info类可以看到class info: version 1.0 description ip route command parser author Julian Jackson author_email jackson.julian55yahoo.com compatible [linux] magic_commands [ip route] tags [command]兼容平台compatible [linux]即该解析器面向 Linux 平台的ip route输出。魔法命令magic_commands [ip route]该字段在 jc 的自动模式jc -a或无参数调用下用于识别输入是否来自ip route命令。注册名称在 jc/lib.py 的解析器列表中其注册名为ip-route这也决定了 CLI 参数使用--ip-route。二、快速上手两种调用方式2.1 命令行方式管道与直接调用$ ip route | jc --ip-route或省略管道让 jc 直接执行命令$ jc ip-route两种方式等价前者接收已执行的ip route输出后者由 jc 在后台代为执行ip route并解析其结果。若配合-p参数可输出带缩进的美化 JSONpretty print$ ip route | jc --ip-route -p2.2 Python 模块方式在 Python 脚本中通过jc.parse()通用入口传入解析器名与原始文本import jc result jc.parse(ip_route, ip_route_command_output)result为包含路由对象列表的 JSON 数据即 Python 的 list of dict可直接被json.dumps序列化或交给其他 Python 库处理。三、输出 Schema 与字段语义ip_route解析器的输出是一个 JSON 数组每个元素对应ip route输出中的一行路由记录。其完整 Schema 如下定义于 jc/parsers/ip_route.py 的 docstring[ { ip: string, via: string, dev: string, metric: integer, proto: string, scope: string, src: string, status: string } ]各字段与ip route输出语法的对应关系JSON 字段对应输出关键词类型含义ip行首目标 /defaultstring路由目标目的网段/主机默认路由固定为defaultviaviastring下一跳网关地址devdevstring出接口设备名如enp0s3、docker0metricmetricinteger路由度量值非 raw 模式下由字符串转换而来protoprotostring路由协议kernel、dhcp、static等scopescopestring路由作用域如linksrcsrcstring源地址选择提示statusstatus/linkdownstring路由状态标记注意并非每条路由都包含所有字段。真实输出中一条路由可能只有ip、dev、proto、scope、src、metric中的部分属性解析器只在字段出现时才将其加入 JSON 对象因此各对象的键数量可能不同。Schema 中的via重复出现是原文档的笔误实际解析逻辑只会写入一次见下文源码分析。四、完整示例从原始输出到 JSON以 tests/fixtures/ubuntu-18.04/ip_route.out 中的真实路由表输出为例default via 10.0.2.2 dev enp0s3 proto dhcp metric 100 10.0.2.0/24 dev enp0s3 proto kernel scope link src 10.0.2.15 metric 100 169.254.0.0/16 dev enp0s3 scope link metric 1000 172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1 linkdown执行解析$ ip route | jc --ip-route -p得到的结果与 tests/fixtures/ubuntu-18.04/ip_route.json 完全一致[ { ip: default, via: 10.0.2.2, dev: enp0s3, proto: dhcp, metric: 100 }, { ip: 10.0.2.0/24, dev: enp0s3, proto: kernel, scope: link, src: 10.0.2.15, metric: 100 }, { ip: 169.254.0.0/16, dev: enp0s3, scope: link, metric: 1000 }, { ip: 172.17.0.0/16, dev: docker0, proto: kernel, scope: link, src: 172.17.0.1, status: linkdown } ]观察示例可以总结出三条典型规则默认路由行首default被映射为ip: default缺省字段省略第 3 条路由没有proto、srcJSON 中便不含这些键linkdown状态第 4 条路由末尾的linkdownDocker 网桥链路中断的典型标记被映射为status: linkdown。之后即可用 jq 做进一步处理例如只列出默认路由的网关$ ip route | jc --ip-route | jq .[] | select(.ip default) | .via五、parse() 函数参数与返回值ip_route解析器的核心入口是parse(data, rawFalse, quietFalse)函数定义于 jc/parsers/ip_route.pydef parse(data, rawFalse, quietFalse): 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 Json objects if data is processed and Raw data if raw true. 三个参数的含义参数类型默认值作用datastring必填待解析的ip route文本输出rawbooleanFalse为True时不做类型转换metric保持字符串原样输出quietbooleanFalse为True时抑制兼容性警告信息例如在非 Linux 平台上解析 Linux 输出时的提示返回值处理后的 JSON 对象列表rawTrue时返回未加工的原始数据输入为空或仅含空白字符时返回[]。六、源码级实现剖析解析器如何工作parse()的实现虽然紧凑却完整覆盖了字段识别、类型转换与边界处理其核心逻辑位于 jc/parsers/ip_route.py。整个流程可以拆解为四个阶段。6.1 阶段一平台兼容性与输入校验jc.utils.compatibility(__name__, info.compatible, quiet) jc.utils.input_type_check(data) if not jc.utils.has_data(data): return []compatibility()见 jc/utils.py检查当前运行平台是否在compatible [linux]列表中若不在且quietFalse会向 STDERR 输出警告提示该解析器支持的平台。这在跨平台处理文件场景中很有用——在 macOS 上解析从 Linux 抓取的路由表文本时警告是预期的可用-q/quietTrue屏蔽。input_type_check()校验输入类型是否符合要求。has_data()见 jc/utils.py仅当输入包含非空白字符时才继续解析否则直接返回空列表[]。对应的测试用例test_ip_route_nodatatests/test_ip_route.py专门验证了空输入返回[]的行为。6.2 阶段二逐行扫描与关键词匹配解析器按行切分输入再对每行做词法切分lines data.splitlines() for line in lines: temp line.split() for word in temp: ...外层循环按行处理内层循环依次检查每个词当遇到via、dev、metric、proto、scope、src、status、default、linkdown等关键词时将其后一个词作为字段值写入structure字典。例如via 10.0.2.2会生成{via: 10.0.2.2}dev enp0s3生成{dev: enp0s3}。place变量记录当前词位置命中关键词后递增一位以跳过已消费的值词。两个特殊映射需要留意遇到default时记录{ip: default}——这是对默认路由的特殊处理遇到linkdown时记录{status: linkdown}——这是链路中断状态标记。而兜底的else分支将行首第一个词temp[0]作为ip字段值即目标网段如10.0.2.0/24。6.3 阶段三metric 的类型转换metric字段在rawFalse默认时会被转换成整数elif word metric: if raw: y {metric: temp[place 1]} else: y {metric: jc.utils.convert_to_int(temp[place1])}convert_to_int()见 jc/utils.py会剥离字符串中的非数字字符并转换为整数因此输出 Schema 中metric的类型是integer。这正是raw参数的用武之地当调用方需要保留原始文本例如后续自行处理时可以传入rawTrue使metric保持字符串形态。6.4 阶段四逐行组装路由对象每行解析结束后if y.get(ip) ! : items.append(structure) structure {} place 0将携带了ip字段的行作为一个完整路由对象追加到items列表然后清空structure开始下一行最终items就是返回的 JSON 数组。这也解释了为什么每个对象的键集合不同字段是按出现即写入的方式累加到字典中的。七、测试验证跨发行版输出的一致性解析器的正确性由单元测试保障见 tests/test_ip_route.py。测试用例覆盖了两个主流发行版的路由表样本Ubuntu 18.04tests/fixtures/ubuntu-18.04/ip_route.out→ 期望 JSONtests/fixtures/ubuntu-18.04/ip_route.jsonCentOS 7.7tests/fixtures/centos-7.7/ip_route.out→ 期望 JSONtests/fixtures/centos-7.7/ip_route.jsondef test_ip_route_ubuntu_18_4(self): self.assertEqual(jc.parsers.ip_route.parse(self.ubuntu_18_4_ip_route, quietTrue), self.ubuntu_18_4_ip_route_json) def test_ip_route_centos_7_7(self): self.assertEqual(jc.parsers.ip_route.parse(self.centos_7_7_ip_route, quietTrue), self.centos_7_7_ip_route_json)从测试夹具可以看到不同发行版的路由表在protodhcpvskernel、scope、src、metric等字段的组合上存在差异但ip_route解析器均能稳定产出结构化结果。需要说明的是当前仓库中两份夹具内容恰好一致测试的作用在于锁定解析行为、防止回归并在未来引入更多平台样本时持续验证。八、实战提示与边界情况使用-q抑制平台警告在非 Linux 平台如 macOS上解析从 Linux 主机抓取的ip route文本时jc 默认会打印兼容性警告jc --ip-route -q或quietTrue可将其关闭不影响解析结果。raw 模式保留原始 metric若需要字符串形式的metric例如做文本比对或保持原始语义可指定rawTrue。空输入安全返回对空字符串或纯空白输入调用parse()会得到[]而非报错适合在脚本中直接处理可能为空的结果。字段按需出现解析结果是稀疏结构消费端代码应使用.get()或 jq 的?运算符处理可能缺失的字段如via、scope、src、status而不是假设每条记录都包含全部键。结合 jq 做自动化路由表是网络运维脚本的高频输入将ip route管道给jc --ip-route后即可用 jq 完成默认网关提取、按dev分组统计、筛选linkdown状态路由等操作而无需正则解析文本。九、参考资源解析器文档docs/parsers/ip_route.md源码实现jc/parsers/ip_route.py工具函数类型转换/兼容性检查jc/utils.py解析器注册表jc/lib.py单元测试tests/test_ip_route.py测试夹具tests/fixtures/ubuntu-18.04/ip_route.out、tests/fixtures/centos-7.7/ip_route.out赞分享开发工具【免费下载链接】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 解析 Windows dir 命令输出dir 解析器使用指南与实现原理jc 解析 Windows dir 命令输出dir 解析器使用指南与实现原理 本文以 jc 项目中 dir 命令解析器为切入点系统讲解如何将 Windows开发工具使用 jc 将 cksum 与 sum 命令输出解析为 JSON解析器详解与实战使用 jc 将 cksum 与 sum 命令输出解析为 JSON解析器详解与实战 cksum 与 sum 是 Unix/Linux 系统上常用的文件校验和计算开发工具jc 解析器实战指南用 jc --history 将 shell history 命令输出转换为 JSONjc 解析器实战指南用 jc history 将 shell history 命令输出转换为 JSON 本指南以 jc 开源项目中的 history 解析器文开发工具上一篇开源项目 aat 使用教程下一篇ttyplot 项目教程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
企业数字化 ERP 产品动态
相关推荐
Atlas 300V 24G上跑通YOLO:CANN工具链与模型转换实战 Atlas 300V 24G这名字,我最早是在一次项目选型会上听到的。当时客户问"这到底是张什么卡,是不是类似GPU的运算加速卡",会议室里几个人说法都不一样——有人说是推理卡,有人说是训练卡,还有人以为它和普通显卡… · 2026/9/25 7:23:56
Atlas 300V实战:YOLO模型从环境搭建到推理部署全解析 很多人一听到Atlas,第一反应是“另一款显卡”,第二反应是“华为的AI芯片”。这两种说法都不算错,但都不够准确。刚接触这个生态时我一度也被文档绕晕,直到真的把YOLO模型在一个Atlas 300V加速卡上跑通推理,才把这块板子… · 2026/9/25 7:23:56
深度拆解iMessage附件后门及辅助模块的完整分析链路 我最早接触“三角测量”(Triangulation)这个代号,是在处理一部iPhone异常发热、流量飙升的排查任务里。查了一整天日志,最后在一个不显眼的iMessage消息附件目录里翻出了一个伪装成图片的二进制文件,当时就觉得不对劲。… · 2026/9/25 7:54:22
酷狗KGG文件解密原理与六种实操方法详解 1. 这不是“破解”,而是对本地音频文件格式的合规技术解析酷狗音乐的.kgg和.kgm文件,本质上是经过封装加密的音频容器,不是传统意义上的“盗版保护”或“DRM版权锁”,而是一种客户端级的资源打包机制——它把原始音频(… · 2026/9/25 7:54:22
Atlas 300V 24G部署YOLO全流程:从推理加速卡到模型优化 1. 从热搜问题说起:Atlas 300V 24G到底是不是运算加速卡最近好几个群都在讨论Atlas 300V 24G,问的最多的就是“这玩意是不是运算加速卡”。我先直接给结论:是加速卡,但准确点说,它是AI推理加速卡,不是训练卡… · 2026/9/25 7:54:16
Atlas 300V 24G运算加速卡深度解析:从NPU原理到YOLO推理部署实战 项目群里又有人问起:“Atlas 300V 24G这卡到底算不算运算加速卡?是不是拿回来插上就能像显卡一样跑YOLO?”这个问题我太熟悉了,几乎每隔一段时间就会看到一次。坦白讲,我第一次拿到Atlas 300V Pro 24G的时候࿰… · 2026/9/25 7:54:16
SKILL.md 实战:用自然语言文档驱动 Agent 技能开发与 OpenClaw 落地 1. 从手搓 Agent 到 SKILL.md:一场开发范式的转移过去大半年,我几乎把市面上能见到的 Agent 框架都折腾了一遍。从最早的 ReAct 循环手写 prompt,到后来用各种编排框架搭工作流,再到接入 MCP 协议打通外部工具,每一步都… · 2026/9/25 7:54:16
大屏数据看板PPT模板改造:数据接入与避坑实战 简介:这份幻灯片模板专用于制作大屏可视化数据分析看板,面向产品运营、市场销售、财务分析等需要做数据汇报的职场人士,也适合中高层管理者用于经营复盘与项目展示,可快速生成清晰直观的大屏展示页面。压缩包内仅有一个演示文稿文… · 2026/9/25 7:54:15
创维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