Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在bash脚本中迭代json_Json_Bash - Fatal编程技术网

如何在bash脚本中迭代json

如何在bash脚本中迭代json,json,bash,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脚本(.

我有如下的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
甚至我也尝试过将数组转换为

别名json decode=“php-r '打印(json)解码(文件\u获取\u内容(\)php://stdin\"),1));'" value=$(curl--user$credentials-k$endPoint | json decode)


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

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

echo $value | tr '"' '\n' | grep @
它用新行字符替换双引号,只保留包含
@
的行。这实际上不是json解析,但它是有效的

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

emails=($(echo $value | tr '"' '\n' | grep @))
并对其进行迭代

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

您应该使用
json\u 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

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

cat so.json | sed "s/},/\n/g" | sed 's/.*"mail":"\([^"]*\)".*/\1/'
使用,您可以按如下方式执行此操作:

$ 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"]

jq
是迭代json的工具。就你而言:

while read user; do
    jq -r '.mail' <<< $user
done <<< $(jq -c '.users[]' users.json)
注意:我删除了“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"}]}

不幸的是,这不适用于复杂对象
{"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"}]}