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