Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 使用Unix工具提取字符串值_Linux_Perl_Json_Unix_Awk - Fatal编程技术网

Linux 使用Unix工具提取字符串值

Linux 使用Unix工具提取字符串值,linux,perl,json,unix,awk,Linux,Perl,Json,Unix,Awk,我编写了一个小的Perl脚本,从给定键名的JSON格式字符串中提取所有值(如下所示)。因此,如果我将Perl脚本的命令行开关设置为id,那么它将从下面的JSON示例返回1、2和stringVal。这个脚本完成了这项工作,但我想看看其他人如何使用其他unix风格的工具(如awk、sed或perl本身)解决同样的问题。谢谢 { "id":"1", "key2":"blah" }, { "id":"2", "key9":"more blah" }, { "id":"str

我编写了一个小的Perl脚本,从给定键名的JSON格式字符串中提取所有值(如下所示)。因此,如果我将Perl脚本的命令行开关设置为id,那么它将从下面的JSON示例返回1、2和stringVal。这个脚本完成了这项工作,但我想看看其他人如何使用其他unix风格的工具(如awk、sed或perl本身)解决同样的问题。谢谢

{
   "id":"1",
   "key2":"blah"
},
{
   "id":"2",
   "key9":"more blah"
},
{
   "id":"stringVal",
   "anotherKey":"even more blah"
}
提取JSON值的perl脚本摘录:

my @values;
while(<STDIN>) {
    chomp;
    s/\s+//g; # Remove spaces
    s/"//g; # Remove quotes
    push @values, /$opt_s:([\w]+),?/g; # $opt_s is a command line switch for the key to find
}

print join("\n",@values);
my@值;
while(){
咀嚼;
s/\s+//g;#删除空格
s//“//g;#删除引号
push@values、/$opt_s:([\w]+)、?/g;#$opt_s是一个用于键查找的命令行开关
}
打印联接(“\n”,@值);

如果您不介意看到引号和冒号字符,我只想使用
grep

grep id file.json

gawk

gawk 'BEGIN{
 FS=":"
 printf "Enter key name: "
 getline key < "-"
}
$0~key{
  k=$2; getline ; v = $2
  gsub("\"","",k)
  gsub("\"","",v)
  print k,v
}' file
如果您只需要id值

$ key="id"
$ awk -vkey=$key -F":" '$0~key{gsub("\042|,","",$2);print $2}' file
1
2
stringVal

以下是一个非常粗略的Awk脚本,用于完成任务:

awk -v k=id -F: '/{|}/{next}{gsub(/^ +|,$/,"");gsub(/"/,"");if($1==k)print $2}' data
  • -F:
    指定“:”作为字段分隔符
  • -v k=id
    设置您要使用的键 寻找
  • 包含“{”的行 或“}”被跳过
  • 第一个gsub 去掉前导空格和 尾随逗号
  • 第二个gsub得到 去掉双引号
  • 最后,如果k 匹配$1,打印$2
data
是包含JSON

sed的文件(前提是该文件的格式如上所述,每行不超过一个条目):


我强烈建议使用该模块。它将在一个函数中解析您的json输入(或返回)。它还提供了一个OOP接口。

当有库可以为您解析字符串时,您为什么要自己解析字符串?几乎所有您能想到的语言都有json解析和编码库(可能还有一些您没有的)。在Perl中:

use strict;
use warnings;
use JSON qw(from_json to_json);

# enable slurp mode
local $/;

my $string = <DATA>;
my $data = from_json($string);

use Data::Dumper;
print "the data was parsed as: " . Dumper($data);

__DATA__
[
    {
       "id":"1",
       "key2":"blah"
    },
    {
       "id":"2",
       "key9":"more blah"
    },
    {
       "id":"stringVal",
       "anotherKey":"even more blah"
    }
]

很好的解决方案。我希望得到一个纯awk的答案,因为我正在努力改进使用awk。谢谢。@steve,请注意,结果和您的perl结果是不同的。请注意:只要文件中有空行或格式稍有改变,就会失败。我指的是一个健壮的纯awk解决方案,当然不需要,它只是更多方便的是源文件名接近脚本的开头,而不是被掩埋在一个Link Error第二示例的中间。GBASE(“042”,“2”)究竟做了什么?它说在双引号和逗号上进行全局替换。请检查您的ASCII表的含义为042。
KEY=id;cat file|sed -n "s/^[[:space:]]*\"$KEY\":\"//p"|sed 's/".*$//'
use strict;
use warnings;
use JSON qw(from_json to_json);

# enable slurp mode
local $/;

my $string = <DATA>;
my $data = from_json($string);

use Data::Dumper;
print "the data was parsed as: " . Dumper($data);

__DATA__
[
    {
       "id":"1",
       "key2":"blah"
    },
    {
       "id":"2",
       "key9":"more blah"
    },
    {
       "id":"stringVal",
       "anotherKey":"even more blah"
    }
]
the data was parsed as: $VAR1 = [
          {
            'key2' => 'blah',
            'id' => '1'
          },
          {
            'key9' => 'more blah',
            'id' => '2'
          },
          {
            'anotherKey' => 'even more blah',
            'id' => 'stringVal'
          }
        ];