如何在不使用json工具和JQ工具的情况下在shell脚本中读取和解析JSON

Lea*_*ner 8 unix linux bash shell sh

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

我尝试了以下命令

$ databasename=`cat process.json | json select '.uri'`
$ echo $databasename
Run Code Online (Sandbox Code Playgroud)

$ databasename=`jq '.uri' process.json`
Run Code Online (Sandbox Code Playgroud)

由于我没有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
Run Code Online (Sandbox Code Playgroud)

小智 8

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

cat process.json | tr { '\n' | tr , '\n' | tr } '\n' | grep "uri" | awk  -F'"' '{print $4}'
Run Code Online (Sandbox Code Playgroud)

  • `awk` 可以完成 `tr` *和* `grep` *和* `sed` 的所有工作,并且在仅读取单个文件时永远不需要 `cat`(它的工作是将多个文件*连接*成一个文件)单流)。`猫富 | bar` 只给了 `bar` 一个 FIFO,而 `bar <foo` 给了它一个标准输入的真实文件句柄;当 `bar` 可以从其输入中的 `seek()` 中受益时,这是一个特别重要的问题(f/e,可以像 `sort` 那样并行化不同线程之间的 I/O 操作)或者询问 FD 以恒定时间获取其长度,而不需要从前到后读取。 (3认同)

Bay*_*you 7

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

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

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

echo '{ "uri" : "/abc", "folder" : true },' | grep -Eo '"uri"[^,]*' | grep -Eo '[^:]*$'
Run Code Online (Sandbox Code Playgroud)

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