如何使用 awk 和 sed 读取 JSON 文件中的列表

如何使用 awk 和 sed 读取 JSON 文件中的列表

我有一个 JSON 文件列表apps.json

{
"properites":{
   "apps":["apple","orange","mango"]
}
}

我需要读取这个文件并获取对象。

我用了:

fwk_app = $( awk '/apps/{ print }' ${apps.json} | grep apps | awk -F: '{ print } substr($0, index($0,$2))}' |sed 's/(,*\)"[/\"]*$/\1/' );
for item in fwk_app:
do
echo"$item"
done

输出是:

mango

我需要的输出是:

apple
orange
mango

答案1

解析 JSON 文件的正确方法是使用 JSON 解析器。这jq公用事业就是这样一种解析器,用于命令行和脚本:

jq -r '.properites.apps[]' apps.json

这将输出

apple
orange
mango

这要求提取文件中 JSON 文档的顶级对象中的jq数组元素。该选项要求输出“原始”数据而不是 JSON 编码的数据。appsproperitesapps.json-rjq

要在单行上获取制表符分隔的输出,请使用

jq -r '.properites.apps | @tsv' file

这将输出

apple   orange  mango

@tsv运算符接受一个数组并将其输出为制表符分隔的列表。您可以改为使用@csv来获取正确引用的 CSV 输出。

请注意,无论您的 JSON 文档是否为

{
  "properites": {
    "apps": [
      "apple",
      "orange",
      "mango"
    ]
  }
}

或者

{"properites":{"apps":["apple","orange","mango"]}}

(这些是同一 JSON 文档的等效形式)。

答案2

你可以使用python

python -c '
import json, sys
data = json.load(sys.stdin)
for el in data["properites"]["apps"]:
  print (el)
' < apps.json

答案3

是最好的答案。附带一个 JSON 模块:

ruby -rjson -e '
    data = JSON.parse(IO.read(ARGV.shift))
    puts data["properites"]["apps"].join("\n")
' apps.json

答案4

grep -P如果可用,您还可以使用:

grep -wF  '"apps":' apps.json | grep -Po '[[,]"\K[^"]*'

但是,这(以及awk@Carlos提供的解决方案)仅在输入为确切地如图所示,如果json相同内容的格式不同,则不会。

一个合适的json解析器,例如jqorpythonjson模块应该是首选!

相关内容