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
답변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
.