我们正在使用简单的curl来通过API获取指标。问题在于,输出固定在参数数量上,而不是固定在输出中的位置。
我们需要使用“简单”的正则表达式来执行此操作,因为该工具仅接受此操作。
/"name":"(.*)".*?"memory":(\d+).*?"consumer_utilisation":(\w+|\d+).*?"messages_unacknowledged":(\d+).*?"messages_ready":(\d+).*?"messages":(\d+)/s
它适用于:
{"name":"queue1","memory":89048,"consumer_utilisation":null,"messages_unacknowledged":0,"messages_ready":0,"messages":0}
但是,如果更改了输出顺序,则不再匹配:
{"name":"queue2","consumer_utilisation":null,"messages_unacknowledged":0,"messages_ready":0,"messages":0,"memory":21944}
{"name":"queue3","consumer_utilisation":null,"messages_unacknowledged":0,"messages_ready":0,"memory":21944,"messages":0}
我需要一个相对的字符串定义来匹配,因为我不知道它们会出现在哪个位置。它总共有9个不同的队列指标组。
答案 0 :(得分:0)
简单的选择是对每个键值对使用一个正则表达式,而不是一个大的正则表达式。
/"name":"((?:[^\\"]|\\.)*)"/
/"memory":(\d+)/
此其他选项不是正则表达式,但可能就足够了。除了使用正则表达式外,您还可以在读取结果前先对其进行转换。因为您说的是“我们正在使用简单的卷曲” ,所以我猜您在谈论的是Curl命令行工具。您可以将结果传递到简单的Perl命令中。
perl -ne 'use JSON; use Text::CSV qw(csv); $hash = decode_json $_; csv (sep_char=> ";", out => *STDOUT, in => [[$hash->{name}, $hash->{memory}, $hash->{consumer_utilisation}, $hash->{messages_unacknowledged}, $hash->{messages_ready}, $hash->{messages}]]);'
这将保持顺序不变,从而使使用正则表达式读取数据更加容易。
输入
{"name":"queue1","memory":89048,"consumer_utilisation":null,"messages_unacknowledged":0,"messages_ready":0,"messages":0}
{"name":"queue2","consumer_utilisation":null,"messages_unacknowledged":0,"messages_ready":0,"messages":0,"memory":21944}
{"name":"queue3","consumer_utilisation":null,"messages_unacknowledged":0,"messages_ready":0,"memory":21944,"messages":0}
输出
queue1;89048;;0;0;0
queue2;21944;;0;0;0
queue3;21944;;0;0;0
为此,您需要Perl并安装JSON和Text :: CSV软件包。在我的系统上,它们分别位于perl
,libjson-perl
和libtext-csv-perl
中。
注意:我目前正在使用
;
作为分隔符。如果其中之一包含在输出中,则将双引号引起来。"name":"que;ue1"
=>"que;ue1";89048;;0;0;0
如果该值同时包含;
和"
,则"
将通过在其前面放置另一个来转义。"name":"q\"ue;ue1"
=>"q""ue;ue1";89048;;0;0;0