如何用jq仅在Kea DHCP查询成功时提取hw-address与ip-address
解决Kea DHCP lease4-get-all查询失败时jq命令失效的问题
核心问题
当调用lease4-get-all返回的result不为0(查询失败)时,返回的JSON结构中不存在leases数组,直接访问.leases[]会导致jq报错退出,无法正常处理结果。
可行解决方案
方案1:带错误提示的条件判断
使用jq的if-then-else结构,成功时提取目标字段,失败时输出错误信息:
curl -X POST -H "Content-Type: application/json" \ -d '{"command": "lease4-get-all", "service": ["dhcp4"]}' \ http://你的Kea服务器地址:8000/ | jq ' if .result == 0 then .leases[] | {hw_address: ."hw-address", ip_address: ."ip-address"} else {error_message: .text, result_code: .result} end '
这个命令会在查询成功时,逐条输出包含硬件地址和IP的对象;失败时输出错误描述和结果码,避免jq报错中断。
方案2:仅处理成功结果(静默忽略失败)
如果只需要在成功时输出结果,失败时不输出任何内容,可以用select先过滤出result为0的情况:
curl -X POST -H "Content-Type: application/json" \ -d '{"command": "lease4-get-all", "service": ["dhcp4"]}' \ http://你的Kea服务器地址:8000/ | jq ' select(.result == 0) | .leases[] | {hw_address: ."hw-address", ip_address: ."ip-address"} '
当查询失败时,jq会直接返回空结果,不会报错。
关键说明
- Kea DHCP的API返回结果中,
result为0表示操作成功,此时才会包含leases数组;非0值对应不同的错误类型,返回结果会包含text字段描述错误原因。 - 必须先对
result字段做判断,再访问leases,否则jq会因为找不到对应字段而抛出Cannot iterate over null或类似错误。
内容的提问来源于stack exchange,提问作者Mark
相关产品推荐
相关产品推荐

