从json文件中获取值

Kal*_*sov 0 perl awk grep sed tr

想要从json文件中获取值:

例:

{"ipaddr":"10.1.1.2","hostname":"host2","role":"http","status":"active"},
{"ipaddr":"10.1.1.3","hostname":"host3","role":"sql","status":"active"},
{"ipaddr":"10.1.1.4","hostname":"host4","role":"quad","status":"active"},
Run Code Online (Sandbox Code Playgroud)

预期:

10.1.1.2 host2 http active
10.1.1.3 host3 sql active
10.1.1.4 host4 quad active
Run Code Online (Sandbox Code Playgroud)

我试着用:

grep -Po '(?<=ipaddr\")[^\"]+'
Run Code Online (Sandbox Code Playgroud)

但是只能得到":",就像结果一样,当我开始得到某些东西时,它只有一个.

Сух*_*й27 6

首先,输入字符串应该是有效的JSON,因此数组元素必须在内部[],最后一个数组元素不应该有尾随逗号.

use strict;
use warnings;
use JSON;
my $s = q(
  [
    {"ipaddr":"10.1.1.2","hostname":"host2","role":"http","status":"active"},
    {"ipaddr":"10.1.1.3","hostname":"host3","role":"sql","status":"active"},
    {"ipaddr":"10.1.1.4","hostname":"host4","role":"quad","status":"active"}
  ]
);

my $aref = decode_json($s);
my @k = qw( ipaddr hostname role status );

print "@$_{@k}\n" for @$aref;

# or
local $" = "|";
print "@$_{@k}\n" for @$aref;
Run Code Online (Sandbox Code Playgroud)

产量

10.1.1.2 host2 http active
10.1.1.3 host3 sql active
10.1.1.4 host4 quad active
Run Code Online (Sandbox Code Playgroud)
10.1.1.2|host2|http|active
10.1.1.3|host3|sql|active
10.1.1.4|host4|quad|active
Run Code Online (Sandbox Code Playgroud)