2014-11-05 33 views
0

Grepping了我写一个bash脚本与badips.com使用数据从返回的wget

此命令:

wget https://www.badips.com/get/key -qO - 

将返回这样的事情:

{"err":"","suc":"new key 5f72253b673eb49fc64dd34439531b5cca05327f has been set.","key":"5f72253b673eb49fc64dd34439531b5cca05327f"} 

或者像这样:

{"err":"","suc":"Your Key was already present! To overwrite, see http:\/\/www.badips.com\/apidoc.","key":"5f72253b673eb49fc64dd34439531b5cca05327f"} 

我需要将键值(5f72253b673eb49fc64dd34439531b5cca05327f)解析为脚本中的变量。我宁愿使用grep来做到这一点,但无法做到。

+1

你应该使用jq工具:http://stedolan.github.io/jq/ – aioobe 2014-11-05 15:16:36

+0

这显然是json数据,为什么不使用json解析器? 'python -m json'想到了。 – Wolph 2014-11-05 15:16:38

+0

它看起来应该是'grep -o REGEXP'的简单使用,并且正则表达式应该与'“key”之后的字符串匹配:“'..你有什么问题?请显示你的尝试。 – Barmar 2014-11-05 15:18:29

回答

0

你可以试试下面的grep命令,

grep -oP '"key":"\K[^"]*(?=")' file 
+1

这似乎工作得很完美。 ! – TexanAdmin 2014-11-05 15:21:41

3

而不是解析一些grep,你有这个完美的工具:jq

参见:

jq '.key' file 

.... your_commands .... | jq '.key' 

将返回

"5f72253b673eb49fc64dd34439531b5cca05327f" 

见另一个例子,例如获得suc属性:

$ cat a 
{"err":"","suc":"new key 5f72253b673eb49fc64dd34439531b5cca05327f has been set.","key":"5f72253b673eb49fc64dd34439531b5cca05327f"} 
{"err":"","suc":"Your Key was already present! To overwrite, see http:\/\/www.badips.com\/apidoc.","key":"5f72253b673eb49fc64dd34439531b5cca05327f"} 
$ jq '.suc' a 
"new key 5f72253b673eb49fc64dd34439531b5cca05327f has been set." 
"Your Key was already present! To overwrite, see http://www.badips.com/apidoc." 
+0

这会工作,但我不想要求人们安装jq。 – TexanAdmin 2014-11-05 15:22:03

+0

它是在使用JSON时不是一个好的做法,使用正则表达式就像不使用XML一样,而是使用为此提供的工具,而且,安装'jq'只是一个命令 – fedorqui 2014-11-05 15:25:30

+0

@fedorqui解析json比解析json要容易得多它是解析xml,但我同意它也更好地使用工具制作的工具。 – 2014-11-05 15:36:05

0

使用

wget https://www.badips.com/get/key -qO - | 
    perl -MJSON -MFile::Slurp=slurp -le ' 
     my $s = slurp "/dev/stdin"; 
     my $d = JSON->new->decode($s); 
     print $d->{key} 
' 

没有那么强的先例之一,但不需要安装新的模块,一个股票perl可以做到这一点:

 wget https://www.badips.com/get/key -qO - | 
     perl -lne 'print $& if /"key":"\K[[:xdigit:]]+/' 
0

awk保持它简单

wget ... - | awk -F: '{split($NF,k,"\"");print k[2]}' 
  1. 字段分隔符是:;
  2. 关键总是在最后一个字段,在awk这个字段是使用$NF(字段数)访问;
  3. split函数拆分$NF并根据分隔符"\""将数组放入数组k中,该分隔符只是一个单引号字符;
  4. k数组的第二个字段是你想要的。