2016-08-12 3 views
-6

Ich habe eine Textdatei wie dieseRubin, wie ein Teil passen

....(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 
.. 

wie den Inhalt zwischen PLAY REKAPITULATION bekommen und localhost und sortieren die Hostnamen wie ec2-123.compute-1.amazonaws.com von seinem Wert ok = folgen?

Ausgabe wie dieser Hash?

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

Haben Sie etwas versucht? –

+0

Vielleicht wie [this] (https://ideone.com/QgscNB). –

Antwort

1

Um einen Eingang aus der ganzen Datei zu erhalten:

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

Um das Ergebnis zu hashify: (. Thx Wiktor Stribiżew für die Erinnerung)

▶ 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" 
# } 

von Hostnamen sortieren

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

Sortieren nach ok Wert (was auch immer es bedeutet.)

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

Schauen Sie, * und sortieren Sie den Host-Namen wie ec2-123.compute-1.amazonaws.com nach seinem Wert ok = * - Ihre Lösung berücksichtigt das nicht. –

+0

@ WiktorStribiżew In der Tat. Jetzt tut es das. – mudasobwa

+0

Entschuldigung mein Fehler, die Auslassung Wörter könnten 'ec2-123.compute-1.amazonaws.com enthalten: ok = 333' wie diese Zeichenfolge –