curl 요청에서 반환 된 JSON을 구문 분석하려고합니다.
curl 'http://twitter.com/users/username.json' |
sed -e 's/[{}]/''/g' |
awk -v k="text" '{n=split($0,a,","); for (i=1; i<=n; i++) print a[i]}'
위의 예는 JSON을 필드로 분할합니다.
% ...
"geo_enabled":false
"friends_count":245
"profile_text_color":"000000"
"status":"in_reply_to_screen_name":null
"source":"web"
"truncated":false
"text":"My status"
"favorited":false
% ...
특정 필드를 인쇄하려면 어떻게해야합니까 (로 표시 -v k=text
)?
답변
명령 줄에서 JSON을 조작하기 위해 특별히 설계된 여러 가지 도구가 있으며 다음과 같이 Awk로 수행하는 것보다 훨씬 쉽고 안정적입니다 jq
.
curl -s 'https://api.github.com/users/lambda' | jq -r '.name'
모듈을 사용하는 Python과 같이 시스템에 이미 설치되어있는 도구를 사용하여이 작업을 수행 할 수도 있습니다json
할 수 있으므로 적절한 JSON 파서의 이점을 유지하면서 추가 종속성을 피하십시오. 다음은 원래 JSON을 인코딩해야하며 최신 터미널에서도 사용하는 UTF-8을 사용한다고 가정합니다.
파이썬 3 :
curl -s 'https://api.github.com/users/lambda' | \
python3 -c "import sys, json; print(json.load(sys.stdin)['name'])"
파이썬 2 :
export PYTHONIOENCODING=utf8
curl -s 'https://api.github.com/users/lambda' | \
python2 -c "import sys, json; print json.load(sys.stdin)['name']"
역사 노트
이 답변은 원래 jsawk를 권장 했지만 여전히 작동해야하지만보다 사용하기가 다소 번거롭고 jq
Python 인터프리터보다 덜 일반적인 독립형 JavaScript 인터프리터가 설치되어 있으므로 위의 답변이 바람직합니다.
curl -s 'https://api.github.com/users/lambda' | jsawk -a 'return this.name'
이 답변은 원래 질문에서 Twitter API를 사용했지만 API가 더 이상 작동하지 않아 테스트 할 예제를 복사하기가 어려워지고 새로운 Twitter API에는 API 키가 필요하므로 GitHub API를 사용하도록 전환했습니다. API 키없이 쉽게 사용할 수 있습니다. 원래 질문에 대한 첫 번째 답변은 다음과 같습니다.
curl 'http://twitter.com/users/username.json' | jq -r '.text'
답변
특정 키의 값을 빠르게 추출하기 위해 개인적으로 “grep -o”를 사용하는 것이 좋습니다. 정규식 일치 만 반환합니다. 예를 들어, 트윗에서 “text”필드를 가져 오려면 다음과 같이하십시오.
grep -Po '"text":.*?[^\\]",' tweets.json
이 정규식은 생각보다 강력합니다. 예를 들어, 쉼표가 포함 된 문자열과 따옴표로 이스케이프 된 문자열을 처리합니다. 나는 조금 더 많은 노력을 기울이면 원자 값이라면 실제로 값을 추출 할 수있는 것을 만들 수 있다고 생각합니다. (네 스팅이있는 경우 정규식은 물론 할 수 없습니다.)
그리고 문자열의 원래 이스케이프를 유지하면서 더 깨끗하게하려면 다음과 같이 사용할 수 있습니다 | perl -pe 's/"text"://; s/^"//; s/",$//'
. ( 이 분석 을 위해이 작업을 수행했습니다 .)
주장하는 모든 싫어하는 사람들에게는 실제 JSON 파서를 사용해야합니다. 그렇습니다. 정확성에 필수적이지만
- 데이터 정리 버그를 확인하기 위해 값을 세거나 데이터에 대한 일반적인 느낌을 얻는 것과 같이 정말 빠른 분석을 수행하려면 명령 줄에서 무언가를 제거하는 것이 더 빠릅니다. 스크립트를 작성하기 위해 편집기를 열면주의가 산만 해집니다.
grep -o
json
적어도 tweets (각각 2KB)에 대해이 작업을 수행 할 때 Python 표준 라이브러리 보다 수십 배 빠릅니다 . 이것이json
느리기 때문인지 확실하지 않습니다 (언젠가 yajl과 비교해야합니다). 그러나 원칙적으로 정규 표현식은 재귀를 지원 해야하는 파서 대신 유한 상태이기 때문에 훨씬 빨라야하며,이 경우 신경 쓰지 않는 구조에 대해 많은 CPU 빌드 트리를 소비합니다. (누군가 적절한 (심도 제한) JSON 파싱을 수행하는 유한 상태 변환기를 작성한 경우 환상적입니다. 그 동안 우리는 “grep -o”를 갖습니다.
유지 관리 가능한 코드를 작성하기 위해 항상 실제 파싱 라이브러리를 사용합니다. 나는 jsawk를 시도하지 않았다 않았지만 제대로 작동하면 포인트 1을 해결합니다.
마지막으로, wackier, 해결책 : Python을 사용 json
하고 원하는 키를 탭으로 구분 된 열로 추출 하는 스크립트를 작성했습니다 . 그런 다음 래퍼를 통해 파이프 awk
를 열에 명명 된 액세스를 허용합니다. 여기에 json2tsv 및 tsvawk 스크립트가 있습니다. 따라서이 예에서는 다음과 같습니다.
json2tsv id text < tweets.json | tsvawk '{print "tweet " $id " is: " $text}'
이 접근법은 # 2를 다루지 않고 단일 Python 스크립트보다 비효율적이며 약간 취합니다. 문자열 값으로 줄 바꿈과 탭을 정규화하여 awk의 필드 / 레코드로 구분 된 세계관을 잘 활용합니다. 그러나 명령 줄에보다 정확한 정확성을 유지할 수 있습니다 grep -o
.
답변
여기에있는 몇 가지 권장 사항 (주석에서 언급)이 Python의 사용을 제안했기 때문에 예제를 찾지 못하는 것에 실망했습니다.
따라서 일부 JSON 데이터에서 단일 값을 얻는 하나의 라이너가 있습니다. 데이터를 (어딘가에서) 파이핑한다고 가정하므로 스크립팅 컨텍스트에서 유용해야합니다.
echo '{"hostname":"test","domainname":"example.com"}' | python -c 'import json,sys;obj=json.load(sys.stdin);print obj["hostname"]'
답변
MartinR과 Boecko의 리드에 따르면 :
$ curl -s 'http://twitter.com/users/username.json' | python -mjson.tool
그렇게하면 매우 grep 친화적 인 출력을 얻을 수 있습니다. 매우 편리합니다 :
$ curl -s 'http://twitter.com/users/username.json' | python -mjson.tool | grep my_key
답변
당신은 단지 할 수 있습니다 다운로드 jq
플랫폼에 대한 바이너리 및 실행 ( chmod +x jq
) :
$ curl 'https://twitter.com/users/username.json' | ./jq -r '.name'
"name"
json 객체에서 속성을 추출 합니다.
jq
홈페이지 는 sed
JSON 데이터 와 같다고 말합니다 .
답변
Node.js 사용
시스템에 마디설치되어 있으면 -p
print 를 사용하고 -e
스크립트 플래그를 평가 JSON.parse
하여 필요한 값을 가져올 수 있습니다.
JSON 문자열을 사용하고 { "foo": "bar" }
“foo”값을 가져 오는 간단한 예 :
$ node -pe 'JSON.parse(process.argv[1]).foo' '{ "foo": "bar" }'
bar
우리는 cat
다른 유틸리티에 액세스 할 수 있기 때문에 파일에 사용할 수 있습니다.
$ node -pe 'JSON.parse(process.argv[1]).foo' "$(cat foobar.json)"
bar
또는 JSON이 포함 된 URL과 같은 다른 형식 :
$ node -pe 'JSON.parse(process.argv[1]).name' "$(curl -s https://api.github.com/users/trevorsenior)"
Trevor Senior
답변
awk를 사용 하는 대신 Python의 JSON 지원을 사용하십시오 !
이 같은:
curl -s http://twitter.com/users/username.json | \
python -c "import json,sys;obj=json.load(sys.stdin);print obj['name'];"