web-dev-qa-db-ja.com

jqを使用してjson出力からキー値を取得する

以下のようなファイルがあります:

{
  "repositories": [
   {
    "id": "156c48fc-f208-43e8-a631-4d12deb89fa4",
    "namespace": "rhel12",
    "namespaceType": "organization",
    "name": "rhel6.6",
    "shortDescription": "",
    "visibility": "public"
   },
   {
    "id": "f359b5d2-cb3a-4bb3-8aff-d879d51f1a04",
    "namespace": "rhel12",
    "namespaceType": "organization",
    "name": "rhel7",
    "shortDescription": "",
    "visibility": "public"
   }
  ]
 }

while read -r lineを使用できるように、新しい行にそれぞれの名前の値のみを取得する必要があります。必要なのは

rhel6.6 
rhel7

私は次のようにjqを使用していますが、動作しないようです:

jq -r '.[].name'

ここでjqの正しい使用を提案してください

10
meallhour

|演算子を使用してフィルターを結合する必要があります。

$ jq -r '.[] | .[] | .name' test.json 
rhel6.6
rhel7

最初の.[]repositories配列をフェッチします。次の.[]は、repositories配列のすべてのアイテムを取得します。最後に、.nameは配列項目(オブジェクト)からプロパティを抽出します。

最初の.[]は文書化された機能であるため、オブジェクトに対して機能します。

.[]
    If you use the .[index] syntax, but omit the index entirely, it
    will return all of the elements of an array...

    You can also use this on an object, and it will return all the
    values of the object.
18
Ruslan Osmanov

入力を配列として扱うのではなく、リポジトリの配列を確認します。

$ jq -r '.repositories[].name' file
rhel6.6
rhel7
14
that other guy

別の解決策があります。要件を想定

-r行の読み取り中に使用できるように、名前の値のみを新しい行で取得します。

Rhel12/rhel6.6形式で出力を取得する方法を教えてください。つまり、名前空間/名前の形式でo/pが必要です。

データがdata.jsonにある場合、コマンド

jq -M -r '.repositories[] | "\(.namespace)/\(.name)"' data.json

生産すべき

rhel12/rhel6.6
rhel12/rhel7
2
jq170727