jq를 사용하여 json의 여러 필드를 순차적으로 구문 분석 및 표시
나는 이 Json을 가지고 있다.
{
"users": [
{
"first": "Stevie",
"last": "Wonder"
},
{
"first": "Michael",
"last": "Jackson"
}
]
}
jq를 사용하여 성과 이름을 순서대로 표시하고 싶습니다.이렇게...
Stevie Wonder
Michael Jackson
내가 여기까지 온 건...
jq '.users[].first, .users[].last'
하지만 표시는
"Stevie"
"Michael"
"Wonder"
"Jackson"
다음의 점에 주의해 주세요.
- 내가 원하지 않는 큰따옴표.
- 내가 원하지 않는 마차는 되돌아온다.
- 뒤죽박죽이야.내 쿼리는 모든 이름을 먼저 표시한 다음 모든 성을 표시합니다.하지만, 나는 첫 번째-마지막, 첫 번째-마지막 한 쌍을 원한다.
문자열 보간 사용을 권장합니다.
jq '.users[] | "\(.first) \(.last)"'
우리는 의 결과를 과장하고 있다..users[]문자열 보간을 사용하여 문자열 ".first . last"를 생성합니다. \(foo)의 문자열 보간에는 구문이 사용됩니다.jq위의 예에서는 "Stevie Wonder"가 됩니다.".users[].first .users[].second"'마이클 잭슨'을 소개합니다.
jq 참조:문자열 보간
addition을 사용하여 문자열을 연결할 수 있습니다.
문자열은 더 큰 문자열에 결합됨으로써 추가됩니다.
jq '.users[] | .first + " " + .last'
위의 내용은 다음 두 가지 경우에 모두 유효합니다.first그리고.lastare string 입니다.다른 데이터 유형(숫자와 문자열)을 추출하는 경우 동등한 유형으로 변환해야 합니다.이 문제에 대한 해결책을 참조합니다.예를들면.
jq '.users[] | .first + " " + (.number|tostring)'
jq '.users[]|.first,.last' | paste - -
다른 사람들이 제안한 것 외에 두 가지 옵션을 언급할 가치가 있다고 생각합니다.
CSV/TSV로 인쇄
$ cat file.json | jq -r '.users[] | [.first, .last] | @tsv'
Stevie Wonder
Michael Jackson
cat file.json | jq -r '.users[] | [.first, .last] | @csv'
"Stevie","Wonder"
"Michael","Jackson"
첫 번째 표현은.users[]질문에서 제시된 코드와 같이 가장 바깥쪽 배열에서 개체를 제거합니다.다음 표현은[.first, .last]는 각 입력 객체의 값 배열을 새로 만듭니다.마지막 식에서는 삽입 함수를 사용합니다.@tsv그리고.@csv모든 입력 어레이를 탭으로 구분된 값과 쉼표로 구분된 값으로 각각 인쇄합니다.
JSON 값으로 인쇄
마찬가지로 JSON 값을 다시 작성할 수 있습니다.이는 필드의 서브셋만 유지하는 경우에 유용합니다.
$ cat file.json | jq -c '.users[] | {first}'
{"first":"Stevie"}
{"first":"Michael"}
나의 접근방식은 (당신의 json 예는 잘 형성되지 않았습니다.)그건 샘플에 불과해)
jq '.Front[] | [.Name,.Out,.In,.Groups] | join("|")' front.json > output.txt
이와 같은 것을 반환한다.
"new.domain.com-80|8.8.8.8|192.168.2.2:80|192.168.3.29:80 192.168.3.30:80"
"new.domain.com -443|8.8.8.8|192.168.2.2:443|192.168.3.29:443 192.168.3.30:443"
출력을 정규 표현으로 grep합니다.
이렇게 하면 일련의 이름이 생성됩니다.
> jq '[ .users[] | (.first + " " + .last) ]' ~/test.json
[
"Stevie Wonder",
"Michael Jackson"
]
위의 두 답변 모두 key, value가 string이면 정상적으로 동작하지만 문자열과 정수를 추가해야 하는 상황이 있었습니다(위 식을 사용한 jq 오류).
요건:json 아래에 URL을 구성하려면
pradeep@seleniumframework>curl http://192.168.99.103:8500/v1/catalog/service/apache-443 | jq .[0]
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 251 100 251 0 0 155k 0 --:--:-- --:--:-- --:--:-- 245k
{
"Node": "myconsul",
"Address": "192.168.99.103",
"ServiceID": "4ce41e90ede4:compassionate_wozniak:443",
"ServiceName": "apache-443",
"ServiceTags": [],
"ServiceAddress": "",
"ServicePort": 1443,
"ServiceEnableTagOverride": false,
"CreateIndex": 45,
"ModifyIndex": 45
}
솔루션:
curl http://192.168.99.103:8500/v1/catalog/service/apache-443 |
jq '.[0] | "http://" + .Address + ":" + "\(.ServicePort)"'
이런 걸 하면서 제가 하고 싶은 것에 꽤 가까워졌어요.
cat my.json | jq '.my.prefix[] | .primary_key + ":", (.sub.prefix[] | " - " + .sub_key)' | tr -d '"'
그 출력은 보통 다른 툴에 문제없이 Import할 수 있을 정도로 매우 가깝습니다.(입력 json의 서브셋을 기본적으로 내보내는 방법을 계속 찾고 있습니다.)
언급URL : https://stackoverflow.com/questions/28164849/using-jq-to-parse-and-display-multiple-fields-in-a-json-serially
'programing' 카테고리의 다른 글
| HTML 만들기: PHP 서버 측과 jQuery 클라이언트 측 (0) | 2023.03.28 |
|---|---|
| 어디서든 Angular UI 모드를 닫는 방법 (0) | 2023.03.28 |
| 서비스에 윈도우를 삽입하는 방법 (0) | 2023.03.28 |
| 파일에서 ESLint react/prop-type 규칙을 비활성화하려면 어떻게 해야 합니까? (0) | 2023.03.28 |
| AngularJS: 렌더링 후 콜백(렌더 후 DOM으로 작업) (0) | 2023.03.28 |