2016-08-12 55 views
-6

我有这样红宝石如何匹配的子

....(omission) 
ec2-123.compute-1.amazonaws.com : ok=333 

.... 

PLAY RECAP ********************************************************************* 
ec2-123.compute-1.amazonaws.com : ok=16 changed=2 unreachable=0 failed=0 
ec2-456.compute-1.amazonaws.com : ok=11 changed=0 unreachable=0 failed=0 
ec2-766.compute-1.amazonaws.com : ok=40 changed=15 unreachable=0 failed=0 
localhost     : ok=0 changed=0 unreachable=0 failed=0 

...(omission) 
ec2-123.compute-1.amazonaws.com : ok=1231 
.. 

一个文本文件,如何获得PLAY重点回顾和本地主机 和排序的主机名状ec2-123.compute-1.amazonaws.com通过它的跟随值OK =之间的内容?

这样的散列输出?

{"ec2-123.compute-1.amazonaws.com" => 16,"ec2-456.compute-1.amazonaws.com" => 11,"ec2-766.compute-1.amazonaws.com" => 40,} 
+0

你试过了吗? –

+0

也许就像[this](https://ideone.com/QgscNB)。 –

回答

1

为了得到一个输入了整个文件的:

▶ input = input[/PLAY RECAP.*?^(.+?)^localhost/m, 1] 

要hashify结果:(THX Wiktor的Stribiżew的提醒)

▶ input.scan(/(\S+) : ok=(\w+)/).to_h 
#⇒ { 
# "ec2-123.compute-1.amazonaws.com" => "16", 
# "ec2-456.compute-1.amazonaws.com" => "11", 
# "ec2-766.compute-1.amazonaws.com" => "40" 
# } 

要通过主机名进行排序

input.scan(/(\S+) : ok=(\w+)/) 
    .to_h 
    .sort_by { |k, _| k[/(?<=ec2-)\d+/].to_i } 

要按排序值(不管它的意思)。

input.scan(/(\S+) : ok=(\w+)/) 
    .to_h 
    .sort_by { |_, ok| ok.to_i } 
+0

看看*,然后按照它的跟随值对ec2-123.compute-1.amazonaws.com这样的主机名进行排序。ok = * - 您的解决方案没有考虑到这一点。 –

+0

@WiktorStribiżew的确。现在确实如此。 – mudasobwa

+0

对不起,我的错误,遗漏的话可能包含'ec2-123.compute-1.amazonaws.com:ok = 333'像这样的字符串 –