读取一个json文件,并使用bash从匹配模式中获取一个字符串

时间:2017-05-05 18:23:36

标签: json bash

我正在尝试使用bash

解析大json文件
//part of json file
{"name": "Jenkins", "version": "Jenkins-2.22"},
{"name": "FitNesse", "version": "FitNesse-2.1"},
{"name": "Quint","version": "Quint-2.12"},
{"name": "Otto","version": "Otto-1.0"},
{"name": "Gradle","version": "Gradle-1.1"}

我能够从json文件中读取匹配'version'的行

while read line; do
  if [[ $line =~ "version" ]] ; then
    echo $line; fi
done < $manifestfile

我想在我的while循环中将值[Jenkins-2.22,FitNesse-2.1,Quint-2.12,Otto-1.0,Gradle-1.1]存储在数组中

需要帮助调整上面的代码

4 个答案:

答案 0 :(得分:3)

假设上面的示例输入位于文件file.json中的JSON 数组内,即:

[
  {"name": "Jenkins", "version": "Jenkins-2.22"},
  {"name": "FitNesse", "version": "FitNesse-2.1"},
  {"name": "Quint","version": "Quint-2.12"},
  {"name": "Otto","version": "Otto-1.0"},
  {"name": "Gradle","version": "Gradle-1.1"}
]

注意:使以下命令在 Bash 3.x 中运行所需的唯一更改是将readarray -t versions替换为IFS=$'\n' read -d '' -ra versions < / p>

使用Bash 4.x和jq

必须首先安装

jq ,但如果可行,这非常值得:启用复杂,强大的JSON解析

# Extract the version numbers and read them into a Bash array.
readarray -t versions < <(jq -r '.[].version' file.json)

# Print the array.
printf '%s\n' "${versions[@]}"

以上产量:

Jenkins-2.22
FitNesse-2.1
Quint-2.12
Otto-1.0
Gradle-1.1

使用Bash 4.x和awk

如果您无法安装jq,则可以选择使用以下awk解决方案,但请注意强度要低得多,并且依赖于JSON的格式与上面完全相同
此警告适用于使用标准实用程序的任何解决方案(awkgrepsed,...) - 只有专用的JSON解析器才能生效鲁棒

readarray -t versions < <(awk -F\" 'NF>1 { print $(NF-1) }' file.json)

# Print the array.
printf '%s\n' "${versions[@]}"

答案 1 :(得分:2)

sed -n 's/.*"\([^"]*\)"}.*/\1/p' <file>

答案 2 :(得分:1)

jq是在Unix shell中操作JSON数据的合适工具。

假设test.json文件包含:

[
{"name": "Jenkins", "version": "Jenkins-2.22"},
{"name": "FitNesse", "version": "FitNesse-2.1"},
{"name": "Quint","version": "Quint-2.12"},
{"name": "Otto","version": "Otto-1.0"},
{"name": "Gradle","version": "Gradle-1.1"}
]

test_json.sh 脚本(简化版):

#!/bin/bash
versions=$(jq '.[] | .version' test.json)
versions_arr=($versions)  # contains an array of `version` key values

我必须 警告 上述方法($versions)(在字符串拆分时创建数组)可能 失败 < / strong>如果字符串$versions中包含 globbing 字符。

更“稳定”的方法是使用带有read选项的内置-a命令将数据逐字地读入指定的数组:

test_json.sh 脚本(“稳定版”):

#!/bin/bash
versions=$(jq '.[] | .version' test.json)
read -a versions_arr <<< $versions  # read `version` key values into array

现在,versions_arrversion个键值的数组 要打印例如你要做的第二个数组值:

echo ${versions_arr[1]} 

输出:

"FitNesse-2.1"

答案 3 :(得分:0)

使用JQ轻松解析Json,只需安装JQ,然后使用:

如果您有一个json数组,并且在每个元素中都有字段版本,您可以使用:

 cat myJsonFile | jq '.[].version'

这将返回版本列表

如果您想逐行处理

while read line; do
  if [[ $line =~ "version" ]] ; then
    echo $line | jq .[] | jq ."version" ; fi
done < $manifestfile