无法在jq中调用bash环境变量

时间:2019-04-27 00:38:49

标签: bash jq

在以下脚本中,我无法在jq命令中成功调用“ repovar”变量。

cat quayrepo.txt | while read line
do
  export repovar="$line"
  jq -r --arg repovar "$repovar" '.data.Layer| .Features[] | "\(.Name), \(.Version), $repovar"' severity.json > volume.csv
done

脚本使用文本文件遍历存储库名称

quayrepo.txt --->文件具有名称列表,在这种情况下,文件的值为"Reponame1"

示例输入的severity.json文件:

{
  "status": "scanned",
  "data": {
    "Layer": {
      "IndexedByVersion": 3,
      "Features": [
        {
          "Name": "elfutils",
          "Version": "0.168-1",
          "Vulnerabilities": [
            {
              "NamespaceName": "debian:9",
              "Severity": "Medium",
              "Name": "CVE-2016-2779"
            }
          ]
        }
      ]
    }
  }
}

所需的输出:

elfutils, 0.168-1, Medium, Reponame1

必需的输出:我需要检索环境变量的值作为输出csv文件中的最后一列

3 个答案:

答案 0 :(得分:3)

您需要将$ repovar括在括号内,作为其他值

repovar='qweqe'; jq -r --arg repovar "$repovar" '.data.Layer| .Features[] | "\(.Name), \(.Version), \($repovar)"' tmp.json

结果:

elfutils, 0.168-1, qweqe

不需要export

答案 1 :(得分:1)

#!/usr/bin/env bash

while read line
do
  jq -r --arg repovar "$line" '.data.Layer.Features[] | .Name + ", " + .Version + ", " + $repovar' severity.json
done < quayrepo.txt > volume.csv

quayrepo.txt

Reponame1

severity.json

{
  "status": "scanned",
  "data": {
    "Layer": {
      "IndexedByVersion": 3,
      "Features": [
        {
          "Name": "elfutils",
          "Version": "0.168-1",
          "Vulnerabilities": [
            {
              "NamespaceName": "debian:9",
              "Severity": "Medium",
              "Name": "CVE-2016-2779"
            }
          ]
        }
      ]
    }
  }
}

产生{

volume.csv

以@peak的观点,将elfutils, 0.168-1, Reponame1 中的>更改为>>将创建多行csv,而不仅仅是覆盖到最后一行

答案 2 :(得分:1)

bash中根本不需要while read循环; jq本身可以循环您的输入行,即使它们不是JSON,也可以让您仅运行jq一次,而不运行quayrepo.txt中的每一行一次。

jq -rR --slurpfile inJson severity.json <quayrepo.txt >volume.csv '
($inJson[0].data.Layer | .Features[]) as $features |
[$features.Name, $features.Version, .] |
@csv
'
  • jq -R指定原始输入,让jq将行从quayrepo.txt读入.
  • jq --slurpfile varname filename.jsonfilename.json读入从该文件解析的JSON对象数组中。如果文件仅包含一个对象,则需要引用$varname[0]来引用它。
  • @csv将数组转换为CSV输出行,正确处理带有嵌入式引号或需要特殊处理的其他奇数的数据。