jq "Invalid numeric literal"
jq "Invalid numeric literal"
我正在尝试使用 jq 将 df -i
命令的输出解析为 json 模板,但是在将数组中的数值读入 json模板:
parse error: Invalid numeric literal at line 10, column 31
这是脚本:
#!/bin/sh
JSON=`cat inode-template.json`
#get number of rows in output
numLines=`df -ih | wc -l`
#row iterator (start at 2 to skip the header row)
for ((row=2; row<=$numLines; row++))
do
arrCounter=0 #array counter reset
#for each value in col (minus 'mounted on'):
for ((val=1; val<=5; val++))
do
value=$(df -iP | awk -v value=$val 'NR=='$row'{sub( "%", "", $value); print $value }') #get each value
tempArr[$arrCounter]=$value #store row value
arrCounter=$((arrCounter + 1))
done
echo "${tempArr[@]}"
#Assign values in json template
JSON=$(jq -c --arg filesys "${tempArr[0]}" --arg iTotal ${tempArr[1]} --arg iUsed ${tempArr[2]} --arg iFree ${tempArr[3]} --arg iPercent ${tempArr[4]} '.metrics[].fileSystem |= $filesys | .metrics[].InodesTotal |= $iTotal | .metrics[].InodesUsed |= $iUsed | .metrics[].InodesFree |= $iFree | .metrics[].InodeUsedPercent |= $iPercent' inode-template.json)
echo "${JSON}"
tempArr=() #reset array
done
这是正在读入的 json 模板:
{
"name": "inodeparse",
"metrics": [
{
"event_type": "test",
"provider": "test",
"fileSystem": "FILESYS",
"InodesTotal":NODESTOTAL,
"InodesUsed":NODESUSED,
"InodesFree":NODESFREE,
"InodeUsedPercent":NODESPERCENT
}
]
}
在使用 jq 替换模板中的值之前,是否可以选择将数组项声明为整数?
您问题的简短回答是:
(1) 您将不得不采用稍微不同的方法,因为 "template" 文件既无效 JSON 也不作为 jq 程序有效
(2) 使用 --argjson
而不是 --arg
,至少对于数字(如果你的 jq 不支持 --argjson,它已经很旧了——绝对是时候升级了:0)
jq Cookbook 有一节描述了使用 jq 进行模板化的两种简单方法。如果可能的话,你最好使用其中一种方法。
下面说明了使用您的模板的“$-variables”方法,修改后模板变量为 jq“$-variables”:
$ cat inode-template.jq
{
"name": "inodeparse",
"metrics": [
{
"event_type": "test",
"provider": "test",
"fileSystem": "FILESYS",
"InodesTotal": $NODESTOTAL,
"InodesUsed": $NODESUSED,
"InodesFree": $NODESFREE,
"InodeUsedPercent": $NODESPERCENT
}
]
}
现在我们可以使用 jq 的 --argjson command-line 选项实例化模板:
$ jq -n --argjson NODESTOTAL 1 --argjson NODESUSED 2 --argjson NODESFREE 3 --argjson NODESPERCENT 4 -f inode-template.jq
{
"name": "inodeparse",
"metrics": [
{
"event_type": "test",
"provider": "test",
"fileSystem": "FILESYS",
"InodesTotal": 1,
"InodesUsed": 2,
"InodesFree": 3,
"InodeUsedPercent": 4
}
]
}
另一种方法也很好。
当然,你也可以使用field-assignment的方式。事实上,这三种方法都是相互兼容的。
我正在尝试使用 jq 将 df -i
命令的输出解析为 json 模板,但是在将数组中的数值读入 json模板:
parse error: Invalid numeric literal at line 10, column 31
这是脚本:
#!/bin/sh
JSON=`cat inode-template.json`
#get number of rows in output
numLines=`df -ih | wc -l`
#row iterator (start at 2 to skip the header row)
for ((row=2; row<=$numLines; row++))
do
arrCounter=0 #array counter reset
#for each value in col (minus 'mounted on'):
for ((val=1; val<=5; val++))
do
value=$(df -iP | awk -v value=$val 'NR=='$row'{sub( "%", "", $value); print $value }') #get each value
tempArr[$arrCounter]=$value #store row value
arrCounter=$((arrCounter + 1))
done
echo "${tempArr[@]}"
#Assign values in json template
JSON=$(jq -c --arg filesys "${tempArr[0]}" --arg iTotal ${tempArr[1]} --arg iUsed ${tempArr[2]} --arg iFree ${tempArr[3]} --arg iPercent ${tempArr[4]} '.metrics[].fileSystem |= $filesys | .metrics[].InodesTotal |= $iTotal | .metrics[].InodesUsed |= $iUsed | .metrics[].InodesFree |= $iFree | .metrics[].InodeUsedPercent |= $iPercent' inode-template.json)
echo "${JSON}"
tempArr=() #reset array
done
这是正在读入的 json 模板:
{
"name": "inodeparse",
"metrics": [
{
"event_type": "test",
"provider": "test",
"fileSystem": "FILESYS",
"InodesTotal":NODESTOTAL,
"InodesUsed":NODESUSED,
"InodesFree":NODESFREE,
"InodeUsedPercent":NODESPERCENT
}
]
}
在使用 jq 替换模板中的值之前,是否可以选择将数组项声明为整数?
您问题的简短回答是:
(1) 您将不得不采用稍微不同的方法,因为 "template" 文件既无效 JSON 也不作为 jq 程序有效
(2) 使用 --argjson
而不是 --arg
,至少对于数字(如果你的 jq 不支持 --argjson,它已经很旧了——绝对是时候升级了:0)
jq Cookbook 有一节描述了使用 jq 进行模板化的两种简单方法。如果可能的话,你最好使用其中一种方法。
下面说明了使用您的模板的“$-variables”方法,修改后模板变量为 jq“$-variables”:
$ cat inode-template.jq
{
"name": "inodeparse",
"metrics": [
{
"event_type": "test",
"provider": "test",
"fileSystem": "FILESYS",
"InodesTotal": $NODESTOTAL,
"InodesUsed": $NODESUSED,
"InodesFree": $NODESFREE,
"InodeUsedPercent": $NODESPERCENT
}
]
}
现在我们可以使用 jq 的 --argjson command-line 选项实例化模板:
$ jq -n --argjson NODESTOTAL 1 --argjson NODESUSED 2 --argjson NODESFREE 3 --argjson NODESPERCENT 4 -f inode-template.jq
{
"name": "inodeparse",
"metrics": [
{
"event_type": "test",
"provider": "test",
"fileSystem": "FILESYS",
"InodesTotal": 1,
"InodesUsed": 2,
"InodesFree": 3,
"InodeUsedPercent": 4
}
]
}
另一种方法也很好。
当然,你也可以使用field-assignment的方式。事实上,这三种方法都是相互兼容的。