【问题标题】:How to read and parse JSON in shell scripting without using json tool and JQ tool [duplicate]如何在不使用 json 工具和 JQ 工具的情况下在 shell 脚本中读取和解析 JSON [重复]
【发布时间】:2019-09-17 09:21:47
【问题描述】:

我正在尝试通过 rest api 从工件下载工件(.war 文件)。我从工件中以 JSON 格式获取文件夹名称,我想通过 shell 脚本在一个变量中获取该名称,但如果不使用 JSON 工具和 JQ 工具,我无法做到这一点,因为我的服务器不包含这两者。有人可以帮我解决这些问题吗?

我试过下面的命令

$ databasename=`cat process.json | json select '.uri'`
$ echo $databasename

$ databasename=`jq '.uri' process.json`

因为我没有 JQ 和 JSON 工具,所以失败了。

$ curl -u User:API Key https://artifactory.es.abc.com/artifactory/api/storage/abc/com/xyz/aa/bb/xx/?list&listFolders=1&includeRootPath=0  > process.json
$ databasename=`cat process.json | json select '.uri'`
$ echo $databasename

【问题讨论】:

  • 在链接的副本中使用python 查看答案。 (也有一些基于awk 的解决方案,但由于通常的原因,它们的能力较差)。
  • ...并注意 none 您的答案以“解析”一词的正式含义或“JSON”的广义含义解析为“所有文档”符合 JSON 规范”。有很多极端情况文本解析器将一无所知——例如,如果某些内容包含 \" 而不是文字引号,则需要在数据中转换为 " 而不是结束它所属的字符串.并且字符串 可以 包含引号(如果被引用的话),或者花括号......等等。

标签: linux bash shell unix sh


【解决方案1】:

您可以使用grepsed 来获取您需要的数据。我会添加一个完整的示例,但 URL 不正确,并且您没有提供(部分)json。

$ cat tmp.json
{
        "json": {
                 "array": [ 1, 2, 3 ]
        },
        "uri": "derp"
}
$ grep 'uri' tmp.json | sed -r 's/^[^:]*:(.*)$/\1/'
 "derp"

对于单行数据,可以使用以下命令:

echo '{ "uri" : "/abc", "folder" : true },' | grep -Eo '"uri"[^,]*' | grep -Eo '[^:]*$'

第一个 grep 将搜索“uri”和之后的所有内容,直到找到逗号,第二个 grep 提取从冒号到字符串末尾的所有内容。

【讨论】:

  • 我尝试了您的解决方案,但低于错误第 2 行:{:找不到命令第 3 行:uri:找不到命令第 2 行是- curl -u 用户:API 密钥 artifactory.es.abc.com/artifactory/api/storage/abc/com/xyz/aa/… > tmp .json 第三行是 - grep 'uri' tmp.json | sed -r 's/^[^:]*:(.*)$/\1/' 我的数据就像- { "uri" : "/abc", "folder" : true },
  • echo '{ "uri" : "/abc", "folder" : true },' | grep -Eo '"uri"[^,]*' | grep -Eo '[^:]*$' 为我工作.. 谢谢:)
【解决方案2】:

更具可读性和易于理解的解决方案是:

cat process.json | tr { '\n' | tr , '\n' | tr } '\n' | grep "uri" | awk  -F'"' '{print $4}'

【讨论】:

  • awk 可以完成tr grep sed 的所有工作,并且永远不需要cat仅读取单个文件时(其工作是将多个文件连接到单个流中)。 cat foo | bar 只给bar 一个FIFO,而bar <foo 给它一个真正的标准输入文件句柄;当bar 可以受益于能够在其输入中使用seek()(f/e,以在不同线程之间并行化 I/O 操作,如sort 所做的那样)或询问FD 以恒定时间获取其长度,而不需要从头到尾读取。
猜你喜欢
  • 2016-01-31
  • 1970-01-01
  • 2014-05-07
  • 2011-04-24
  • 2017-01-06
  • 1970-01-01
  • 2022-05-19
  • 2020-05-06
  • 2016-09-29
相关资源
最近更新 更多