在shell脚本中读取json数据

use*_*398 50 bash shell json

在shell中我有一个要求,其中我必须阅读JSON响应,其格式如下:

 { "Messages": [ { "Body": "172.16.1.42|/home/480/1234/5-12-2013/1234.toSort", "ReceiptHandle": "uUk89DYFzt1VAHtMW2iz0VSiDcGHY+H6WtTgcTSgBiFbpFUg5lythf+wQdWluzCoBziie8BiS2GFQVoRjQQfOx3R5jUASxDz7SmoCI5bNPJkWqU8ola+OYBIYNuCP1fYweKl1BOFUF+o2g7xLSIEkrdvLDAhYvHzfPb4QNgOSuN1JGG1GcZehvW3Q/9jq3vjYVIFz3Ho7blCUuWYhGFrpsBn5HWoRYE5VF5Bxc/zO6dPT0n4wRAd3hUEqF3WWeTMlWyTJp1KoMyX7Z8IXH4hKURGjdBQ0PwlSDF2cBYkBUA=", "MD5OfBody": "53e90dc3fa8afa3452c671080569642e", "MessageId": "e93e9238-f9f8-4bf4-bf5b-9a0cae8a0ebc" } ] }
Run Code Online (Sandbox Code Playgroud)

在这里,我只关注"Body"属性值.我做了一些不成功的尝试,如:

 jsawk -a 'return this.Body' 
Run Code Online (Sandbox Code Playgroud)

要么

 awk -v k="Body" '{n=split($0,a,","); for (i=1; i<=n; i++) print a[i]} 
Run Code Online (Sandbox Code Playgroud)

但这还不够.谁能帮我这个?

use*_*398 82

jq在命令行上解析JSON:

 jq '.Body'
Run Code Online (Sandbox Code Playgroud)

访问jq:https://stedolan.github.io/jq/

  • 如果您找到了它并需要将其用于其他平台:https://stedolan.github.io/jq/download/ (2认同)

Édo*_*pez 12

TL;博士

$ cat /tmp/so.json | underscore select '.Messages .Body' 
["172.16.1.42|/home/480/1234/5-12-2013/1234.toSort"]
Run Code Online (Sandbox Code Playgroud)

Javascript CLI工具

您可以使用Javascript CLI工具

选择a的所有name孩子addons:

underscore select ".addons > .name"
Run Code Online (Sandbox Code Playgroud)

underscore-cli为他人提供现实世界的例子还有JSON:选择()文档.


Min*_*ius 5

同样使用Bash regexp.应该能够抢夺任何键/值对.

key="Body"
re="\"($key)\": \"([^\"]*)\""

while read -r l; do
    if [[ $l =~ $re ]]; then
        name="${BASH_REMATCH[1]}"
        value="${BASH_REMATCH[2]}"
        echo "$name=$value"
    else
        echo "No match"
    fi
done
Run Code Online (Sandbox Code Playgroud)

可以调整正则表达式以匹配多个空格/制表符或换行符.如果价值已嵌入,则无效".这是一个例证.最好使用一些"工业"解析器:)

  • 这不适用于每个可能的键/值对。考虑`“ key”:“值\”带引号\“”` (2认同)