Parsing List results


#1

Hi Folks,

I need to parse a result that comes in this format :

=========================
ec2.describe_instances #=>
[{:aws_image_id => “ami-e444444d”,
:aws_reason => “”,
:aws_state_code => “16”,
:aws_owner => “000000000888”,
:aws_instance_id => “i-123f1234”,
:aws_reservation_id => “r-aabbccdd”,
:aws_state => “running”,
:dns_name =>
domU-12-34-67-89-01-C9.usma2.compute.amazonaws.com”,
:ssh_key_name => “staging”,
:aws_groups => [“default”],
:private_dns_name =>
domU-12-34-67-89-01-C9.usma2.compute.amazonaws.com”,
:aws_instance_type => “m1.small”,
:aws_launch_time => “2008-1-1T00:00:00.000Z”},
:aws_availability_zone => “us-east-1b”,
:aws_kernel_id => “aki-ba3adfd3”,
:aws_ramdisk_id => “ari-badbad00”,
…, {…}]

When I invoke the method,

puts @ec2.describe_instances

the results comes like this :

aws_image_idami-e444444daws_reasonaws_state_codeaws_owner000000000888aws_instance_id
i-123f1234aws_reservation_idr-aabbccddaws_staterunningdns_name
domU-12-34-67-89-01-C9.usma2.compute.amazonaws.comssh_key_namestagingaws_groups

Question :

Is there a way of accessing a specific key, for example : aws_status ?
If so, how do I do that ?

Thank you so much.

Regards.


#2

On Jan 19, 2009, at 12:00 PM, Fernando Ramos wrote:

:aws_instance_id    => "i-123f1234",
:aws_availability_zone => "us-east-1b",

=========================
If so, how do I do that ?

Thank you so much.

Regards.

You can:
require ‘pp’
pp @ec2.describe_instances

or just use #inspect: (which is what irb does with the last expression
anyway)
p @ec2.describe_instances
puts @ec2.describe_instances.inspect

As for getting the specific key (did you mean ‘aws_state’?), perhaps
something like:
@ec2.describe_instances.each do |instance_hash|
puts “%20s:
%s”%instance_hash.values_at(:aws_instance_id, :aws_state)
end

       i-123f1234: running

You can look at: String#%, Kernel.sprintf, Hash#values_at, and Hash#[]
(oh yeah, and Enumerable#each) for the details.

-Rob

Rob B. http://agileconsultingllc.com
removed_email_address@domain.invalid


#3

Rob B. wrote:

On Jan 19, 2009, at 12:00 PM, Fernando Ramos wrote:

:aws_instance_id    => "i-123f1234",
:aws_availability_zone => "us-east-1b",

=========================
If so, how do I do that ?

Thank you so much.

Regards.

You can:
require ‘pp’
pp @ec2.describe_instances

or just use #inspect: (which is what irb does with the last expression
anyway)
p @ec2.describe_instances
puts @ec2.describe_instances.inspect

As for getting the specific key (did you mean ‘aws_state’?), perhaps
something like:
@ec2.describe_instances.each do |instance_hash|
puts “%20s:
%s”%instance_hash.values_at(:aws_instance_id, :aws_state)
end

       i-123f1234: running

You can look at: String#%, Kernel.sprintf, Hash#values_at, and Hash#[]
(oh yeah, and Enumerable#each) for the details.

-Rob

Rob B. http://agileconsultingllc.com
removed_email_address@domain.invalid

Hi Rob,

You’ve got it !!! Thank you so much. It is working the way I want now !
Appreciate it !

Regards,

Fernando.


#4

Fernando Ramos wrote:

puts @ec2.describe_instances

the results comes like this :

aws_image_idami-e444444daws_reasonaws_state_codeaws_owner000000000888aws_instance_id
i-123f1234aws_reservation_idr-aabbccddaws_staterunningdns_name
domU-12-34-67-89-01-C9.usma2.compute.amazonaws.comssh_key_namestagingaws_groups

puts outputs strings, so it calls .to_s on its argument.

.to_s on a hash calls .to_s on all its keys and values, and mashes them
together.

Use p @ec2.describe_instances, or require ‘pp’ and use pp.

Is there a way of accessing a specific key, for example : aws_status ?
If so, how do I do that ?

p @ec2.describe_instances[2][:aws_status]

Now play around with (and read the docs on) Array and Hash!