如何在bash脚本中迭代json

时间:2013-10-21 07:23:15

标签: json bash

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

  

值= { “计数”:5 “用户”:[{ “用户名”: “ASA”, “名称”:“ASA   过渡 “ ”邮件“: ”asa@xyz.com“},{ ”用户名“: ”QQ“, ”名“:” QQ   莫里斯 “ ”邮件“: ”qq@xyz.com“},{ ”用户名“: ”QWE“, ”名“:” QWE   组织”, “邮件”: “qwe@xyz.com”}]}

输出可以是

mail=asa@xyz.com,qq@xyz.com,qwe@xyz.com

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

中完成

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

for key in "${!value[@]}"
do
        #echo "key = $key"
        echo "value = ${value[$key]}"
done

即使我已尝试将数组转换为

  

alias json-decode =“php -r   '的print_r(json_decode(的file_get_contents(\ “PHP://标准输入\”),1));'”   value = $(curl --user $ credentials -k $ endPoint | json-decode)

仍然无法获得具体的输出。

5 个答案:

答案 0 :(得分:7)

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

echo $value | tr '"' '\n' | grep @

它用新行字符替换双引号,只保留包含@的行。它实际上不是json解析,但它可以工作。

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

emails=($(echo $value | tr '"' '\n' | grep @))

并迭代它们

for email in ${emails[@]}
do
    echo $email
done

答案 1 :(得分:3)

你应该使用json_pp工具(在debian中,它是libjson-pp-perl包的一部分)

有人会像这样使用它:

  

cat file.json | json_pp

为你的json打印漂亮的照片。

所以在你的情况下,你可以这样做:

#!/bin/bash
MAILS=""  
LINES=`cat test.json | json_pp | grep '"mail"' | sed 's/.* : "\(.*\)".*/\1/'`
for LINE in $LINES ; do
    MAILS="$LINE,$MAILS"
done
echo $MAILS | sed 's/.$//'

输出:

qwe@xyz.com,qq@xyz.com,asa@xyz.com

答案 2 :(得分:1)

使用标准的unix工具箱:sed命令

cat so.json | sed "s/},/\n/g" | sed 's/.*"mail":"\([^"]*\)".*/\1/'

答案 3 :(得分:0)

使用R,您可以执行以下操作:

$ 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"}]}
$ echo $value | R path users | R map path mail
["asa@xyz.com", "qq@xyz.com", "qwe@gyz.com"]

答案 4 :(得分:0)

jq是用于遍历json的工具。就您而言:

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

将给出:

asa@xyz.com
qq@xyz.com
qwe@xyz.com

注意:我删除了“ 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"}]}