我有以下代码,工作正常。问题是我得到以下输出:
设备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
答案 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
或您正在运行的命令,但看起来您正在运行某个命令,然后过滤某些行,然后从这些行打印一些信息。如果是这种情况,那么任何不匹配的行都会为nil
和mac
提供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