如何在bash脚本中迭代json

Sar*_*ang 6 bash json

我有如下的json,我需要在bash脚本中只获取上面json的邮件

value = {"count":5,"users":[{"username":"asa","name":"asa Tran","mail":"asa@xyz.com"},{"username": "qq","name":"qq Morris","mail":"qq@xyz.com"},{"username":"qwe","name":"qwe Org","mail":"qwe @ xyz.com"}]}

输出可以是

mail=asa@xyz.com,qq@xyz.com,qwe@xyz.com
Run Code Online (Sandbox Code Playgroud)

以上所有内容都需要在bash脚本(.sh)中完成

我已经尝试过使用数组迭代但没有用

for key in "${!value[@]}"
do
        #echo "key = $key"
        echo "value = ${value[$key]}"
done
Run Code Online (Sandbox Code Playgroud)

即使我已尝试使用数组转换

alias json-decode ="php -r'print_r(json_decode(file_get_contents(\"php:// stdin \"),1));'"value = $(curl --user $ credentials -k $ endPoint | json-解码)

仍然我无法获得具体的输出.

cbl*_*ard 7

如果这是有效的json并且电子邮件字段是唯一包含@字符的字段,则可以执行以下操作:

echo $value | tr '"' '\n' | grep @
Run Code Online (Sandbox Code Playgroud)

它用新行字符替换双引号,只保留包含的行@.它真的不是json解析,但它的工作原理.

您可以将结果存储在bash数组中

emails=($(echo $value | tr '"' '\n' | grep @))
Run Code Online (Sandbox Code Playgroud)

并迭代它们

for email in ${emails[@]}
do
    echo $email
done
Run Code Online (Sandbox Code Playgroud)


Chr*_*aes 5

jq是遍历 json 的工具。在你的情况下:

while read user; do
    jq -r '.mail' <<< $user
done <<< $(jq -c '.users[]' users.json)
Run Code Online (Sandbox Code Playgroud)

会给:

asa@xyz.com
qq@xyz.com
qwe@xyz.com
Run Code Online (Sandbox Code Playgroud)

注意:我删除了“value=”,因为那不是有效的 json。Users.json 包含:

{"count":5,"users":[{"username":"asa","name":"asa Tran","mail":"asa@xyz.com"},{"username":"qq","name":"qq Morris","mail":"qq@xyz.com"},{"username":"qwe","name":"qwe Org","mail":"qwe@xyz.com"}]}
Run Code Online (Sandbox Code Playgroud)