使用Unix工具提取字符串值

时间:2009-11-16 15:57:59

标签: 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":"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);

7 个答案:

答案 0 :(得分:8)

答案 1 :(得分:5)

我强烈建议使用JSON模块。它将在一个函数(和后面)中解析您的json输入。它还提供OOP接口。

答案 2 :(得分:2)

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

输出

$ ./shell.sh
Enter key name: id
1, blah
2, more blah
stringVal, even more blah

如果你只想要id值,

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

答案 3 :(得分:2)

这是一个非常粗略的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

的文件

答案 4 :(得分:1)

sed(如果文件格式如上,每行不超过一个条目):

KEY=id;cat file|sed -n "s/^[[:space:]]*\"$KEY\":\"//p"|sed 's/".*$//'

答案 5 :(得分:1)

为什么在有库为你做这个时你自己解析字符串? json.org有几乎所有你能想到的语言的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"
    }
]

..生成输出(我在数据周围添加了一个顶级数组,因此它将被解析为一个对象):

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

答案 6 :(得分:0)

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

grep id file.json