0

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"},

期待される:

10.1.1.2 host2 http active
10.1.1.3 host3 sql active
10.1.1.4 host4 quad active

私は試してみます:

grep -Po '(?<=ipaddr\")[^\"]+'

しかし、結果のように「:」しか取得できず、何かを取得し始めたときに1つしか取得できませんでした。

4

5 に答える 5

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;

出力

10.1.1.2 host2 http active
10.1.1.3 host3 sql active
10.1.1.4 host4 quad active

10.1.1.2|host2|http|active
10.1.1.3|host3|sql|active
10.1.1.4|host4|quad|active
于 2013-09-20T12:38:34.417 に答える
1

使用するawk

awk -F\" '{print $4,$8,$12,$16}' file
10.1.1.2 host2 http active
10.1.1.3 host3 sql active
10.1.1.4 host4 quad active

その他のバリエーション

awk -F\" '{for (i=4;i<=16;i+=4) printf "%s ",$i;print ""}' file
于 2013-09-20T12:38:31.777 に答える
1
perl -lne 'push @a,/:\"([^\"]*)\"/g;print "@a";undef @a' your_file

テスト済み:

> cat temp
{"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"},
> perl -lne 'push @a,/:\"([^\"]*)\"/g;print "@a";undef @a' temp
10.1.1.2 host2 http active
10.1.1.3 host3 sql active
10.1.1.4 host4 quad active
> 
于 2013-09-20T12:54:03.513 に答える
1
grep -Po ':"\K[^"]*' file

必要なすべての値を出力します。-oしかし、各マッチングが 1 行に収まるため、フォーマットは期待したものではありません。あなたが試すことができるのは:

 grep -Po ':"\K[^"]*' file|xargs -n4 

テスト:

kent$  grep -Po ':"\K[^"]*' f|axrgs -n4           
10.1.1.2 host2 http active
10.1.1.3 host3 sql active
10.1.1.4 host4 quad active

awkを使用すると、抽出とフォーマットを一度に行うことができます。

awk -F'":"|","|"}' '{print $2,$4,$6,$8}' file

多くのフィールドがある場合は、ループを記述して、EVEN idx でフィールドを出力するだけです。

ファイルでテストします。

kent$  awk -F'":"|","|"}' '{print $2,$4,$6,$8}' f
10.1.1.2 host2 http active
10.1.1.3 host3 sql active
10.1.1.4 host4 quad active
于 2013-09-20T12:25:31.590 に答える