멤버 추출

멤버 추출

아래는 컬 명령의 출력(브랜치에 대한 파일 정보)입니다. 파일 이름, 파일 유형 및 크기를 인쇄하려면 스크립트 또는 명령이 필요합니다.

시도했지만 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옵션은 "컴팩트" 형식을 생성합니다. 한 줄에 하나의 객체

결과:

[".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이러한 방식으로 빌드됩니다(크기가 존재하는 레코드만 처리됨).

관련 정보