아래는 컬 명령의 출력(브랜치에 대한 파일 정보)입니다. 파일 이름, 파일 유형 및 크기를 인쇄하려면 스크립트 또는 명령이 필요합니다.
시도했지만 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'[],"'
-t
column
입력을 기반으로 열 수를 추측하도록 지시합니다.-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
이러한 방식으로 빌드됩니다(크기가 존재하는 레코드만 처리됨).