programing

jq를 사용하여 json의 여러 필드를 순차적으로 구문 분석 및 표시

iphone6s 2023. 3. 28. 21:20
반응형

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"

다음의 점에 주의해 주세요.

  1. 내가 원하지 않는 큰따옴표.
  2. 내가 원하지 않는 마차는 되돌아온다.
  3. 뒤죽박죽이야.내 쿼리는 모든 이름을 먼저 표시한 다음 모든 성을 표시합니다.하지만, 나는 첫 번째-마지막, 첫 번째-마지막 한 쌍을 원한다.

문자열 보간 사용을 권장합니다.

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

반응형