2016-08-12 71 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'像這樣的字符串 –