从 json 数据中 Grep 字符串

从 json 数据中 Grep 字符串

我得到以下格式的 json 数据,我更喜欢使用 usesedawkjq不支持,grep -osolaris 盒子上不支持

[{"FRUIT":"APPLE","CAR":"FORESTER","COMPANY":"SUBARU","MAKE":"2015","CITY":"UNION CITY","STATE":0,"COUNTRY":0,"LOCATION":0,"RANK":"1"},{"FRUIT":"MANGO","CAR":"OUTBACK","COMPANY":"SUBARU","MAKE":"2017","CITY":"EDISON","STATE":0,"COUNTRY":0,"LOCATION":0,"RANK":"2"},{"....."}]

我正在寻找提取第二列的数据

"FORESTER"
"OUTBACK"

答案1

您可以使用json_xs,它通常默认安装在任何支持 Perl 的系统上:

json_xs -f json -t json-pretty < file | grep '"CAR"' | cut -d ':' -f2 | cut -d '"' -f2

或者使用 Python:

python3 -m json.tool file | grep '"CAR"' | cut -d ':' -f2 | cut -d '"' -f2

答案2

尝试以下命令

$ sed "s/{/\n/g" file.txt | awk -F, 'NF>=2{split($2,Arr,":");print Arr[2]}'
"FORESTER"
"OUTBACK"

我们使用 sed 命令将单行分成多行,然后使用 awk,我们检索第二列值

答案3

这不是最优雅的方法,但这适用于您的示例数据:

$ tr , '\n' < file | awk -F: '{if(/\{/){NR=1}}NR==2{print $2}'
"FORESTER"
"OUTBACK"

将用换行符tr替换所有,内容。 awk 会NR0看到{.由于NR保存当前行号并在每行自动递增,这意味着它只会出现2在每组键值对的第二行。那么,当NRis时2,我们打印第二个:- 分隔的字段。


或者,使用支持 JSON 数据的适当脚本语言。例如,在perl

$ perl -M"JSON" -lne 'my $json = decode_json($_); 
                      foreach $f (@{$json}){print $f->{"CAR"};}' file
FORESTER
OUTBACK

答案4

我在这个答案中使用的工具jq可以从以下位置下载https://stedolan.github.io/jq/(甚至对于 Solaris)并安装在非 root 用户的主目录中,没有任何 root 访问权限。此外,它根本没有任何运行时依赖性。


JSON 文档中没有“第二列”。你的文件也可以这样写

[
  {
    "FRUIT": "APPLE",
    "CAR": "FORESTER",
    "COMPANY": "SUBARU",
    "MAKE": "2015",
    "CITY": "UNION CITY",
    "STATE": 0,
    "COUNTRY": 0,
    "LOCATION": 0,
    "RANK": "1"
  },
  {
    "FRUIT": "MANGO",
    "CAR": "OUTBACK",
    "COMPANY": "SUBARU",
    "MAKE": "2017",
    "CITY": "EDISON",
    "STATE": 0,
    "COUNTRY": 0,
    "LOCATION": 0,
    "RANK": "2"
  }
]

添加的空格不会影响实际的 JSON 数据。

要提取与 key 对应的所有条目的值CAR,请使用jq命令行 JSON 解析器:

$ jq '.[].CAR' file.json
"FORESTER"
"OUTBACK"

该表达式的.[].CAR意思是“对于最顶层数组的每个元素,返回键的值CAR”。

如果您希望输出中没有引号,请将-r(或--raw-output) 添加到jq调用中。这将返回解码后的数据。

相关内容