次のjsonファイルがあります
{
"total": 64,
"p": 1,
"ps": 1,
"paging": {
"pageIndex": 1,
"pageSize": 1,
"total": 64
},
"effortTotal": 216,
"issues": [
{
"key": "AX8lZNY1h5xTw2fmJuX6",
"rule": "xml:S125",
"severity": "MAJOR",
"component": "X8lXT9yjCYHsI0QujFF:pom.xml",
"project": "X8lXT9yjCYHsI0QujFF",
"line": 29,
"hash": "6e7405674b46c05cd7d7fc9433dbb323",
"textRange": {
"startLine": 29,
"endLine": 33,
"startOffset": 6,
"endOffset": 22
},
"flows": [],
"status": "OPEN",
"message": "Remove this commented out code.",
"effort": "5min",
"debt": "5min",
"author": "[email protected]",
"tags": [
"unused"
],
"creationDate": "2021-12-19T18:54:28+0100",
"updateDate": "2022-02-23T08:03:15+0100",
"type": "CODE_SMELL",
"scope": "MAIN"
}
],
"components": [
{
"key": "X8lXT9yjCYHsI0QujFF:pom.xml",
"enabled": true,
"qualifier": "FIL",
"name": "pom.xml",
"longName": "pom.xml",
"path": "pom.xml"
},
{
"key": "X8lXT9yjCYHsI0QujFF",
"enabled": true,
"qualifier": "TRK",
"name": "my-app",
"longName": "my-app"
}
],
"facets": [
{
"property": "types",
"values": [
{
"val": "BUG",
"count": 34
},
{
"val": "CODE_SMELL",
"count": 30
},
{
"val": "VULNERABILITY",
"count": 0
}
]
}
]
}
以下のように値を印刷したいと思います。
BUG=34
以下の回避策を試しましたが、要件に従って印刷されませんでした。
jq -r '.facets[].values[0].val,.facets[].values[0].count' file.json
次のように印刷してください
BUG
34
しかし、[0]のBUG、[1]のCODE_SMELLなどをもう一度言及する必要があります。
次のように印刷する方法はありますか?
BUG=34
CODE_SMELL:30
VULNERABILITY:0 (it will be null but I can put condition to print it is as zero in shell script while referring it as variable)
ご案内ください。私はJQを初めて使用します。 sedを使用して行う方法はわかっていますが、スクリプトに追加するにはより多くの手順が必要です。
答え1
配列の各要素から合計値を抽出して、val
次の文字列形式で指定できます。count
values
facets
key=value
jq -r '.facets[].values[] | "\(.val)=\(.count // 0 | @sh)"' file
この@sh
演算子は、文字列が文字列を引用し、潜在的に問題のある文字をエスケープして、変数の割り当てとしてシェルで実行するのに適した型であることを確認します。
これにより、または欠落している場合は値が使用されます.count // 0
。0
.count
null
false
上記の文書が与えられた場合、このコマンドは以下を生成します。
BUG=34
CODE_SMELL=30
VULNERABILITY=0
上記のコマンドの出力を評価すると、シェル変数が生成されます。
$ unset -v BUG CODE_SMELL VULNERABILITY # clears the variables
$ eval "$( jq -r '.facets[].values[] | "\(.val)=\(.count // 0 | @sh)"' file )"
$ echo "$BUG"
34
$ printf '%s\n' "$BUG" "$CODE_SMELL" "$VULNERABILITY"
34
30
0