You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用jq解析df -i输出至JSON模板时遇数值错误,如何声明数组项为整数

解决jq解析df -i输出时的「Invalid numeric literal」错误

这个问题很常见——df -i输出的数值本质是字符串,直接赋值给JSON里的数字字段时,jq会因为类型不匹配抛出错误。核心解决思路就是把字符串形式的数值显式转换为整数,再替换模板值,下面给你具体的实现方案:

错误原因拆解

当你从df -i提取出类似"123456"的字符串,直接赋值给JSON模板中预期为数字的字段时,jq会尝试把这个字符串解析为数字,但如果没有显式转换,它会认为这是一个无效的数字字面量,从而报错。

具体解决方案

我们分两步走:先提取df -i的数值,再用jq的tonumber函数转成整数,最后填充到模板里。

示例场景

假设你的JSON模板文件inode_template.json长这样:

{
  "filesystem": "/dev/sda1",
  "inode_stats": {
    "total_inodes": 0,
    "used_inodes": 0,
    "free_inodes": 0,
    "usage_percent": 0
  }
}

完整命令实现

# 提取df -i的关键数据(去掉使用率的%符号),再用jq处理
df -i /dev/sda1 | awk 'NR==2 {
  print $2, $3, $4, substr($5, 1, length($5)-1)
}' | jq -R '
  # 把输入字符串拆分成数组,逐个转成整数
  split(" ") | map(tonumber) as $inode_data
  # 加载模板并替换数值
  | $template | .inode_stats.total_inodes = $inode_data[0]
              | .inode_stats.used_inodes = $inode_data[1]
              | .inode_stats.free_inodes = $inode_data[2]
              | .inode_stats.usage_percent = $inode_data[3]
' --argfile template inode_template.json

关键细节说明

  1. awk提取数据:过滤掉df -i的表头行,只取第二行的数值,同时把使用率的%符号去掉,避免后续转换失败。
  2. jq -R处理字符串输入:用-R参数把awk输出的一行字符串读入jq,再用split(" ")拆分成数组。
  3. map(tonumber)转换类型:遍历数组,把每个字符串元素转成整数,确保赋值给JSON数字字段时类型匹配。
  4. 容错处理(可选):如果担心df -i输出有异常值(比如空字符串),可以用tonumber? // 0做容错,转换失败时默认设为0:
    split(" ") | map(tonumber? // 0) as $inode_data
    

无模板文件的简化写法

如果不想单独维护模板文件,也可以直接在jq里定义模板结构:

df -i / | awk 'NR==2 {print $2, $3, $4, substr($5,1,length($5)-1)}' | jq -R '
  split(" ") | map(tonumber) as $data
  | {
      filesystem: "/",
      inode_stats: {
        total_inodes: $data[0],
        used_inodes: $data[1],
        free_inodes: $data[2],
        usage_percent: $data[3]
      }
    }
'

内容的提问来源于stack exchange,提问作者nobrac

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 09:31:21