从Bash中的JSON文件中仅提取一些密钥

时间:2019-03-13 18:38:37

标签: linux bash

所以,我有一个看起来像这样的JSON文件;

 {
    "data": { stuff that i need }
    "stuff not needed": {more stuff not needed}
    "data": {more stuff that i need}
 }

简而言之,我需要的东西在“数据”键的花括号内。如何在Linux Shell命令中打印此内容?请注意,我的文件中有几个“数据”对象,我想一次从所有这些对象中提取数据。

预期的输出  会是这样

data {...}
data {...}

3 个答案:

答案 0 :(得分:1)

正如其他人建议的那样,您应该真正使用jq工具来解析json格式。但是,如果您无权使用该工具和/或无法安装它,则下面是一种非常简单的方法,将json视为原始文本(不推荐)并生成所需的输出:

 grep "\"data\":" json_file | tr -d \"

答案 1 :(得分:1)

您可以非常简单地将awk"{"的字段分隔符以及substrlength($2) - 1一起使用来修剪结尾"}"

例如您的数据:

$ awk -F"{" '/^[ ]*"data"/{print substr($2, 1, length($2)-1)}' json
 stuff that i need
more stuff that i need

注意:如果需要,您可以在第一行的"stuff"之前剪掉开头的空格)

快速说明

  • awk -F"{"awk字段分隔符调用'{'
  • /^[ ]*"data"/仅定位以零个或多个空格开头,后跟"data"的行,
  • print substr($2, 1, length($2)-1)将第二个字段的子字符串从第一个字符打印到length-1字符,以除去结尾的'}'

bash解决方案

使用bash,您可以遍历每行,寻找以"data"开头的行,然后使用几个简单的参数扩展从每一端删除行中不需要的部分。例如:

$ while read -r line; do 
    [[ $line =~ ^\ *\"data\" ]] && { 
        line="${line#*\{}"
        line="${line%\}*}"
        echo $line 
    }
done <json

(使用json文件名中的数据,您只需将其复制/粘贴到终端中即可)

使用/输出示例

 $ while read -r line; do
>     [[ $line =~ ^\ *\"data\" ]] && {
>         line="${line#*\{}"
>         line="${line%\}*}"
>         echo $line
>     }
> done <json
stuff that i need
more stuff that i need

注意: bash默认分词甚至可以为您处理前导空白)

虽然您可以使用awkbash进行操作,但是任何严重的JSON操作都应使用jq实用程序来完成。

答案 2 :(得分:1)

使用给定的输入,您可以使用

sed -rn 's/.*"(data)": (.*)/\1 \2/p' inputfile