簡體   English   中英

無法在jq中調用bash環境變量

[英]cannot call bash environment variable inside 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"

輸入的樣本嚴重性.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文件中的最后一列

您需要將$ repovar括在括號中,其他值

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

結果:

elfutils, 0.168-1, qweqe

無需export

#!/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

...severity.json >> volume.csv...severity.json >> volume.csv中將>更改為>>將創建多行csv,而不僅僅是覆蓋到最后一行

您根本不需要在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.json讀取filename.json成從該文件中解析JSON對象的數組。 如果文件僅包含一個對象,則需要引用$varname[0]來引用它。
  • @csv將數組轉換為CSV輸出行,正確處理帶有嵌入式引號或需要特殊處理的其他@csv數據。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM