たとえば、次は私のプログラムの出力です(気になっている場合は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[^,]*'
これはキー(引用符を含む)の値を取得します"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から情報を抽出してテストするもう1つの簡単な選択肢は次のとおりです。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 $