ruby输出格式

时间:2011-03-15 19:07:24

标签: ruby

我有以下代码,工作正常。问题是我得到以下输出:

设备ID:SEP1C17D3415659

IP地址:10.2.3.101

我想得到:

SEP1C17D3415659 10.2.3.101

感谢您的帮助


require 'net/telnet'
require '/apps/dateformat'


@tdate = Formatdate.new.mydate

hosts = %w"SW3"


  hosts.each do |hostname|

        tn = Net::Telnet::new("Host" => "#{hostname}",
                                     "Timeout" => 10000,
                                     "Prompt" => /[$%#>] \z/n)

        tn.cmd('String' =>'user' , 'Match'=>/Password:/) { |c| puts c }
        tn.cmd('String' =>'password', 'Match'=>/#/) { |c| puts c }
        tn.cmd('String' =>'terminal length 0', 'Match'=>/#/) { |c| puts c }


        File.open("/agents/#{hostname}-#{@tdate}-agents.txt",'w') do |o|
            run=tn.cmd('String' =>'sh cd ne de | inc Device ID: | IP address:', 'Match'=>/#/) { |c| puts c }
                        run.each_line do |re|
                        mac = re.match /Device ID: ([\S]+)/
                        #ip = re.match /([\S]+) address/
                        ip = re.match /IP address: ([\S]+)/
                        o.puts mac
                        o.puts ip
                    end




        end

end

2 个答案:

答案 0 :(得分:3)

puts会在每次输出后自动打印一个新行。简单地说两者都在同一条线上。

outputString = mac + " " + ip
o.puts outputString

如果您有其他可用的输出功能,例如print,它将起作用,而不会在两个语句之间添加换行符。

答案 1 :(得分:1)

您正确指定了正则表达式所需的分组,但在打印时却没有使用它。

你的正则表达式是:

mac = re.match /Device ID: ([\S]+)/

这与整行Device ID: SEP1C17D3415659相匹配,将您想要的部分(SEP1C17D3415659)放入一个组中,以便以后可以使用它。但是,然后使用

将其打印出来
o.puts mac

这给出了整个匹配,而不仅仅是组。你想要的是这个:

o.puts mac[1]

仅指定组。

另外,正如Cody所说,puts在每次通话时添加换行符。如果你想在同一行上打印两个匹配项,请尝试类似:

o.print "#{mac[1]} #{ip[1]}\n"

代替。


修改

我不熟悉net/telnet或您正在运行的命令,但看起来您正在运行某个命令,然后过滤某些行,然后从这些行打印一些信息。如果是这种情况,那么任何不匹配的行都会为nilmac提供ip,因此您将在这些行上获得“undefind method []”。< / p>

如果是这种情况,您只需使用:

o.print "#{mac[1]} #{ip[1]}\n" unless mac.nil?

通过将两个正则表达式合并为一个,您可能会发现稍微重构代码以更好地表达您正在做的事情是值得的。在不知道实际线条的结构的情况下,我无法创建您需要的真实表达,但它看起来像这样:

run.each_line do |line|
  match = line.match /^Device ID: ([\S]+), IP address: ([\S]+)$/ #these are the lines we want
  next unless match #skip lines we don't want
  o.print "#{match[1]} #{match[2]}\n" #print the details we're interested in
end