Bash 스크립트에서 json의 키 값 쌍 값을 찾는 방법

Bash 스크립트에서 json의 키 값 쌍 값을 찾는 방법

make s 컬 호출을 사용하여 bash 스크립트를 작성하고 json 문서를 얻으려고 합니다. json 문서에는 이름이 지정된 키가 access_token있으며 해당 필드의 값을 추출해야 합니다. 이것은 내 JSON 문서입니다

echo $json

{"access_token":"kjdshfsd", "key2":"value"}

나는 그것을 설치하지 않았습니다 jq.

답변1

짧은 답변: 설치jq

json 파서 없이 json을 파싱하면 안 됩니다.

이렇게 하려면 다음을 수행하십시오 jq.

echo "$json" | jq -r '.access_token'

또는 echo탭 및 줄 바꿈 인코딩이 확장되지 않도록 하려면,

jq -r -n --argjson data "$json" '$data.access_token'

내가 선호하는 JSON 파서는 다음과 같습니다.JSON, 이를 사용하려면 다음을 수행할 수 있습니다.

echo "$json" | json access_token

노트:두 솔루션 모두 json 객체가 예제에 표시된 것과 정확히 동일(또는 적어도 거의 동일)하다고 가정합니다.

답변2

아니요 jq, awk, sed:

#!/bin/bash
json='{"access_token":"kjdshfsd", "key2":"value"}' 
    
echo $json | grep -o '"access_token":"[^"]*' | grep -o '[^"]*$'

여기에서 테스트하고 작업 중입니다. https://ideone.com/Fw4How

원천:https://brianchildress.co/parse-json-using-grep

답변3

json 파서를 설치할 수 없는 경우 문자열에 큰따옴표나 개행 문자가 포함될 수 없다고 가정하면 각 레코드는 한 줄에 있고 각 레이블과 값은 게시한 것처럼 큰따옴표로 묶인 문자열입니다. 샘플 입력에 표시된 대로 이 awk를 사용하는 모든 UNIX 시스템의 모든 쉘에서 작동합니다.

$ cat tst.awk
{
    while ( match($0,/"[^"]*"/) ) {
        hit = substr($0,RSTART+1,RLENGTH-2)
        if ( ++cnt % 2 ) {
            tag = hit
        }
        else {
            val = hit
            f[tag] = val
        }
        $0 = substr($0,RSTART+RLENGTH)
    }
    print f[tgt]
}

$ echo "$json" | awk -v tgt='access_token' -f tst.awk
kjdshfsd

$ echo "$json" | awk -v tgt='key2' -f tst.awk
value

답변4

대안으로 jq, 최신 버전의 miller( mlr)는 표의 행과 같이 스칼라 값만 포함하는 JSON 객체의 경우와 마찬가지로 표 형식 데이터를 나타내는 한 JSON 입력을 지원합니다.

printf %s "$json" | mlr --j2n cut -f access_token

mlr값을 다시 포맷하지 않는 장점(또는 PoV에 따른 단점)이 있습니다. 좋아 1e1하거나 10.00000000000000001그렇지 않을 것입니다 10.

관련 정보