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

器件 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

最佳答案

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

你的正则表达式是:

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 或您正在运行的命令,但看起来您正在运行某个命令,然后过滤某些行,然后从这些行打印一些信息。如果是这种情况,那么任何不匹配的行都会为您提供 nilmacip,因此您将在这些行上得到“undefind method []”。

如果是这种情况,您可以简单地使用:
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

关于ruby 输出格式,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5316688/

10-12 18:09