예를 들어, 다음은 내 프로그램의 출력입니다(궁금하신 경우 bspwm).
{
"id": 29360131,
"splitType": "vertical",
"splitRatio": 0.5,
"birthRotation": 90,
"vacant": true,
"sticky": false,
"private": false,
"locked": false,
"presel": null,
"rectangle": {
"x": 0,
"y": 0,
"width": 1920,
"height": 1200
},
"firstChild": null,
"secondChild": null,
"client": {
"className": "Termite",
"instanceName": "termite",
"borderWidth": 1,
"state": "floating",
"lastState": "tiled",
"layer": "normal",
"lastLayer": "normal",
"urgent": false,
"visible": true,
"icccmFocus": true,
"icccmInput": true,
"minWidth": 10,
"maxWidth": 0,
"minHeight": 19,
"maxHeight": 0,
"wmStatesCount": 0,
"wmState": [],
"tiledRectangle": {
"x": 0,
"y": 0,
"width": 958,
"height": 1198
},
"floatingRectangle": {
"x": 638,
"y": 394,
"width": 642,
"height": 410
}
}
}
"state"
나는 그것이 사실 인지 확인하고 싶었다 "tiling"
. 이 경우에는 입니다 "floating"
.
답변1
부울 테스트와 함께 jq 사용
JSON이 다음과 같은 변수에 저장되어 있다고 가정합니다.JSON, 쉘 프롬프트에서 다음을 수행할 수 있습니다.
$ echo "$json" | jq '.client.state | test("tiling")'
false
코퍼스에 해당 값이 포함되어 있으므로 이는 false를 올바르게 반환합니다 floating
.
부정적인 테스트
또는 값이 다음과 같은지 테스트하고 싶다면아니요 tiling
, | not
필터를 사용하여 테스트 논리를 무효화할 수 있습니다. 예를 들어:
$ echo "$json" | jq '.client.state | test("tiling") | not'
true
클라이언트 상태가 아니기 때문에 이는 올바르게 true를 반환합니다 tiling
.floating
가치 추출
필터가 일반적인 방식으로 작동하는지 확인하려면 jq를 사용하여 중첩된 키 값을 구문 분석할 수도 있습니다. 예를 들어:
$ echo "$json" | jq .client.state
"floating"
그런 다음 해당 정보를 사용하여 테스트 및 필터를 검증할 수 있습니다. 또는 추가 프로세스를 생성해도 괜찮다면 해당 정보를 셸 파이프라인에서 fgrep
또는로 전달하면 됩니다.fgrep -v
답변2
더 나은 옵션은 JSON 파서를 사용하는 것입니다.
당신이 사용을 주장하는 경우 grep
:
grep
PCRE( -P
) 를 지원한다고 가정합니다 .
bspwm | grep -Po '"state":\K[^,]*'
이것은 key (따옴표 포함) 값을 얻습니다 "state"
.
키 주위에 따옴표를 원하지 않는 경우:
bspwm | grep -Po '"state":"\K[^"]*'
예를 들어:
% grep -Po '"state":\K[^,]*' <<<'{"id":29360131,"splitType":"vertical","splitRatio":0.500000,"birthRotation":90,"vacant":true,"sticky":false,"private":false,"locked":false,"presel":null,"rectangle":{"x":0,"y":0,"width":1920,"height":1200},"firstChild":null,"secondChild":null,"client":{"className":"Termite","instanceName":"termite","borderWidth":1,"state":"floating","lastState":"tiled","layer":"normal","lastLayer":"normal","urgent":false,"visible":true,"icccmFocus":true,"icccmInput":true,"minWidth":10,"maxWidth":0,"minHeight":19,"maxHeight":0,"wmStatesCount":0,"wmState":[],"tiledRectangle":{"x":0,"y":0,"width":958,"height":1198},"floatingRectangle":{"x":638,"y":394,"width":642,"height":410}}'
"floating"
% grep -Po '"state":"\K[^"]*' <<<'{"id":29360131,"splitType":"vertical","splitRatio":0.500000,"birthRotation":90,"vacant":true,"sticky":false,"private":false,"locked":false,"presel":null,"rectangle":{"x":0,"y":0,"width":1920,"height":1200},"firstChild":null,"secondChild":null,"client":{"className":"Termite","instanceName":"termite","borderWidth":1,"state":"floating","lastState":"tiled","layer":"normal","lastLayer":"normal","urgent":false,"visible":true,"icccmFocus":true,"icccmInput":true,"minWidth":10,"maxWidth":0,"minHeight":19,"maxHeight":0,"wmStatesCount":0,"wmState":[],"tiledRectangle":{"x":0,"y":0,"width":958,"height":1198},"floatingRectangle":{"x":638,"y":394,"width":642,"height":410}}'
floating
답변3
다음과 같은 전용 JSON 파서를 사용하세요.지상, 더 강력한 방법입니다.
jshon -e client -e state -u < file
floating
답변4
JSON에서 정보를 추출하고 테스트하는 또 다른 간단한 대안은 다음과 같습니다.jtc
도구(소스 json이 있다고 가정 file.json
):
bash $ cat file.json | jtc -w "[state]:<tiling>" | grep "tiling" >/dev/null; if [ $? == 0 ]; then echo "true"; else echo "false"; fi;
false
bash $
bash $ cat file.json | jtc -w "[state]:<floating>" | grep "floating" >/dev/null; if [ $? == 0 ]; then echo "true"; else echo "false"; fi;
true
bash $