代码之家  ›  专栏  ›  技术社区  ›  Gowtham Ramamoorthy

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

  •  0
  • Gowtham Ramamoorthy  · 技术社区  · 6 年前

    在下面的脚本中,我无法在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
    

    该脚本使用一个文本文件循环遍历repo名称

    奎雷波。txt--->文件具有名称列表。在本例中,文件的值为 "Reponame1"

    样本输入严重性。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文件中的最后一列

    0 回复  |  直到 6 年前
        1
  •  4
  •   LMC    6 年前

    与其他值一样,需要用括号括住$repovar

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

    结果:

    elfutils, 0.168-1, qweqe
    

    没有必要这么做 export .

        2
  •  1
  •   thehole    6 年前
    #!/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 包含

    elfutils, 0.168-1, Reponame1
    

    到@peak的点,改变 > >> 在里面 ...severity.json >> volume.csv 将创建多行csv,而不只是覆盖到最后一行

        3
  •  1
  •   Charles Duffy    6 年前

    你不需要医生 while read 在bash中循环; 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直接从 奎雷波。txt 进入 .
    • jq --slurpfile varname filename.json 读到 filename.json 转换为从该文件解析的JSON对象数组。如果文件只包含一个对象,则需要引用 $varname[0] 参考一下。
    • @csv 将数组转换为CSV输出行,正确处理带有嵌入引号或其他需要特殊处理的奇怪数据。