8

我有如下的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

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

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

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

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

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

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

4

5 回答 5

8

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"}]}
于 2018-08-21T10:42:03.960 回答
7

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

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

它用换行符替换双引号,并且只保留包含@. 它真的不是json解析,但它有效。

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

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

并迭代它们

for email in ${emails[@]}
do
    echo $email
done
于 2013-10-21T07:28:56.883 回答
3

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

有人会这样使用它:

猫文件.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
于 2013-10-21T07:50:23.537 回答
1

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

cat so.json | sed "s/},/\n/g" | sed 's/.*"mail":"\([^"]*\)".*/\1/'
于 2013-10-21T08:55:24.793 回答
-1

使用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"]
于 2014-12-07T12:31:49.870 回答