[英]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.