使用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
关键细节说明
awk提取数据:过滤掉df -i的表头行,只取第二行的数值,同时把使用率的%符号去掉,避免后续转换失败。jq -R处理字符串输入:用-R参数把awk输出的一行字符串读入jq,再用split(" ")拆分成数组。map(tonumber)转换类型:遍历数组,把每个字符串元素转成整数,确保赋值给JSON数字字段时类型匹配。- 容错处理(可选):如果担心
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
相关产品推荐
相关产品推荐

