メンバーの抽出

メンバーの抽出

以下は、curlコマンドの出力(ブランチのファイル情報)です。ファイル名、ファイルタイプ、サイズを印刷するには、スクリプトまたはコマンドが必要です。

試しましたが、jq単一の値を取得できました(jq '.values[].size')。

{
  "path": {
    "components": [],
    "name": "",
    "toString": ""
  },
  "revision": "master",
  "children": {
    "size": 5,
    "limit": 500,
    "isLastPage": true,
    "values": [
      {
        "path": {
          "components": [
            ".gitignore"
          ],
          "parent": "",
          "name": ".gitignore",
          "extension": "gitignore",
          "toString": ".gitignore"
        },
        "contentId": "c9e472ef4e603480cdd85012b01bd5f4eddc86c6",
        "type": "FILE",
        "size": 224
      },
      {
        "path": {
          "components": [
            "Jenkinsfile"
          ],
          "parent": "",
          "name": "Jenkinsfile",
          "toString": "Jenkinsfile"
        },
        "contentId": "e878a88eed6b19b2eb0852c39bfd290151b865a4",
        "type": "FILE",
        "size": 1396
      },
      {
        "path": {
          "components": [
            "README.md"
          ],
          "parent": "",
          "name": "README.md",
          "extension": "md",
          "toString": "README.md"
        },
        "contentId": "05782ad495bfe11e00a77c30ea3ce17c7fa39606",
        "type": "FILE",
        "size": 237
      },
      {
        "path": {
          "components": [
            "pom.xml"
          ],
          "parent": "",
          "name": "pom.xml",
          "extension": "xml",
          "toString": "pom.xml"
        },
        "contentId": "9cd4887f8fc8c2ecc69ca08508b0f5d7b019dafd",
        "type": "FILE",
        "size": 2548
      },
      {
        "path": {
          "components": [
            "src"
          ],
          "parent": "",
          "name": "src",
          "toString": "src"
        },
        "node": "395c71003030308d1e4148b7786e9f331c269bdf",
        "type": "DIRECTORY"
      }
    ],
    "start": 0
  }
}

予想される出力は次のとおりです。

.gitignore    FILE     224

Jenkinsfile   FILE     1396

答え1

@JigglyNagaの回答は、質問に記載されているユースケースに対してこれより優れている可能性がありますが、より複雑な作業の場合は、次のようにリスト項目を繰り返すこともできますkeys

からfile

for k in $(jq '.children.values | keys | .[]' file); do
    ...
done

または文字列から:

for k in $(jq '.children.values | keys | .[]' <<< "$MYJSONSTRING"); do
    ...
done

たとえば、次のように使用できます。

for k in $(jq '.children.values | keys | .[]' file); do
    value=$(jq -r ".children.values[$k]" file);
    name=$(jq -r '.path.name' <<< "$value");
    type=$(jq -r '.type' <<< "$value");
    size=$(jq -r '.size' <<< "$value");
    printf '%s\t%s\t%s\n' "$name" "$type" "$size";
done | column -t -s$'\t'

値に改行文字がない場合は、jqループ内で単一の呼び出しでこれを実行できるため、速度が速くなります。

for k in $(jq '.children.values | keys | .[]' file); do
    IFS=$'\n' read -r -d '' name type size \
        <<< "$(jq -r ".children.values[$k] | .path.name,.type,.size" file)"
    printf '%s\t%s\t%s\n' "$name" "$type" "$size";
done | column -t -s$'\t'

答え2

メンバーの抽出

jq -c '.children.values[]|[.path.components[0],.type,.size]'
  • .children.values[]配列の各メンバーを印刷します.values
  • |シェルパイプなど、次のフィルタを使用して前の結果をパイプします。
  • [... ,...内のすべての用語を配列として表示します,]
  • この-cオプションは「コンパクト」形式を生成します。 1行に1つのオブジェクト

結果:

[".gitignore","FILE",224]
["Jenkinsfile","FILE",1396]
["README.md","FILE",237]
...

結果の書式設定

きちんと整列したテーブルを出力するには、他のツールがこれをよりよく処理できます。columnまたはpaste

jq -c '.children.values[]|[.path.components[0],.type,.size]' | column -t -s'[],"'
  • -tcolumn入力に基づいて列数を推測するように指示します。
  • -s...区切り記号の指定

結果:

.gitignore   FILE       224
Jenkinsfile  FILE       1396
README.md    FILE       237

[これは、]および文字がファイル名に表示されないため安全な仮定ではありませ,"

paste複数の入力を並べて配置することもできます。これを行うには、JSON構造を完全に削除して元の行を出力できます(@muruに賛辞を送ります)。

jq -r '.children.values[]|.path.components[0],.type,.size' | paste - - -

paste - - -すべて同じソースから読み取られた3つの列を表します。今回は、ファイル名に改行文字が含まれていないことが唯一の前提です。

答え3

jq出力はさまざまな形式でレンダリングできます。https://stedolan.github.io/jq/manual/#Formatstringsandescaping

タブ区切り出力の場合:

$ jq -r '.children.values[] | [.path.name, .type, .size] | @tsv' file.json
.gitignore  FILE    224
Jenkinsfile FILE    1396
README.md   FILE    237
pom.xml FILE    2548
src DIRECTORY   

答え4

ベースのライニングソリューションjtcそしてxargs:

bash $ jtc -x'<values>l[+0]<size>l[-1]' -y'<name>l' -y'<type>l' -y'<size>l' your.json | xargs -n3
.gitignore FILE 224
Jenkinsfile FILE 1396
README.md FILE 237
pom.xml FILE 2548
bash $ 

メモ:ファイルにjsonの不規則性があります(サイズキーはすべてのレコードに存在しません)。これを除外するために、最初のパラメータは-xこのように構築されます(サイズが存在するレコードのみが処理されます)。

関連情報