首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >jq“无效数字文字”

jq“无效数字文字”
EN

Stack Overflow用户
提问于 2018-02-22 23:18:13
回答 1查看 6.4K关注 0票数 4

我试图使用jq将df -i命令的输出解析为json模板,但当将数值从数组读取到json模板时,会收到以下错误:

代码语言:javascript
运行
复制
parse error: Invalid numeric literal at line 10, column 31

下面是脚本:

代码语言:javascript
运行
复制
#!/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模板:

代码语言:javascript
运行
复制
{
  "name": "inodeparse",
  "metrics": [
    {
      "event_type": "test",
      "provider": "test",
      "fileSystem": "FILESYS",
      "InodesTotal":NODESTOTAL,
      "InodesUsed":NODESUSED,
      "InodesFree":NODESFREE,
      "InodeUsedPercent":NODESPERCENT
    }
  ]
}

在使用jq替换模板中的值之前,是否有任何选项将数组项声明为整数?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-02-22 23:38:28

对您的问题的简短回答是:(1)您必须采用一种稍微不同的方法,因为“模板”文件既不是有效的JSON,也不是jq程序(2)使用--argjson而不是--arg,至少对于数字(如果您的jq不支持--argjson,这是非常老的-肯定是升级的时候了:0)

jq食谱有一节描述了使用jq进行模板处理的两种简单方法。如果可能的话,使用这些方法中的一种会更好。

以下说明了使用模板进行修改的“$-变量”方法,使模板变量为jq“$-变量”:

代码语言:javascript
运行
复制
$ cat inode-template.jq
{
  "name": "inodeparse",
  "metrics": [
    {
      "event_type": "test",
      "provider": "test",
      "fileSystem": "FILESYS",
      "InodesTotal": $NODESTOTAL,
      "InodesUsed": $NODESUSED,
      "InodesFree": $NODESFREE,
      "InodeUsedPercent": $NODESPERCENT
    }
  ]
}

现在,我们可以使用jq的--argjson命令行选项实例化模板:

代码语言:javascript
运行
复制
$ 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
    }
  ]
}

另一种方法也很好。

当然,你也可以使用实地分配的方法。事实上,这三种方法都是相互兼容的。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48938815

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档