在以下脚本中,我无法在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文件中的最后一列
答案 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"
}
]
}
]
}
}
}
产生{1>的
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.json
将filename.json
读入从该文件解析的JSON对象数组中。如果文件仅包含一个对象,则需要引用$varname[0]
来引用它。@csv
将数组转换为CSV输出行,正确处理带有嵌入式引号或需要特殊处理的其他奇数的数据。