如何用Perl将Cisco ISE设备数据解析为CSV格式
解决Cisco ISE设备数据转CSV的问题
首先咱们先捋清楚你遇到的核心问题:你之前尝试的第二个脚本之所以没输出,是因为Data::Dumper的输出是多个独立的$VAR1变量,不是一个完整可被eval解析的哈希结构,所以eval $contents根本没法正确转换成你想要的数据结构,自然就没结果了。
其实完全不用绕弯子存文件再解析,咱们直接在第一个获取ISE数据的脚本里生成CSV就行,既高效又不容易出错。
方案一:直接在ISE查询脚本中生成CSV
你已经用Net::Cisco::ISE拿到了设备数据,直接结合Text::CSV处理即可,完整代码如下:
use Net::Cisco::ISE; use Text::CSV; # 初始化ISE连接,替换成你的实际信息 my $ise = Net::Cisco::ISE->new( hostname=>'your-ise-hostname', username=>'your-username', password=>'your-password' ); # 初始化CSV对象,处理格式细节 my $csv = Text::CSV->new({ binary => 1, eol => "\n" }) or die "Cannot use CSV: ".Text::CSV->error_diag(); # 打印CSV表头 $csv->print(\*STDOUT, ["Name", "ip"]); # 遍历所有设备 for my $name (keys %{$networkdevices}){ my $device = $ise->networkdevices("id" => $networkdevices->{$name}->id); my $device_name = $device->name; # 从返回的结构中提取IP地址 my $ip_address = $device->NetworkDeviceIPList->{NetworkDeviceIP}->{ipaddress}; # 输出CSV行 $csv->print(\*STDOUT, [$device_name, $ip_address]); }
额外说明(多IP场景)
如果你的设备存在多个IP(NetworkDeviceIP是数组引用),可以改成以下逻辑处理:
# 处理单/多IP兼容场景 my $ip_entries = $device->NetworkDeviceIPList->{NetworkDeviceIP}; if (ref $ip_entries eq 'ARRAY') { # 遍历多个IP foreach my $entry (@$ip_entries) { $csv->print(\*STDOUT, [$device_name, $entry->{ipaddress}]); } } else { # 单个IP的情况 $csv->print(\*STDOUT, [$device_name, $ip_entries->{ipaddress}]); }
方案二:解析已生成的my_output文件
如果你一定要处理已经存好的my_output文件,我们可以通过正则逐行匹配Data::Dumper的输出,提取需要的信息:
use strict; use warnings; use Text::CSV; my $csv = Text::CSV->new({ binary => 1, eol => "\n" }) or die "Cannot use CSV: ".Text::CSV->error_diag(); $csv->print(\*STDOUT, ["Name", "ip"]); open my $fh, '<', './my_output' or die "Could not open file: $!"; my ($current_name, $current_ip); while (my $line = <$fh>) { chomp $line; # 匹配设备名称行 if ($line =~ /\$VAR1 = '(.*)';/) { $current_name = $1; } # 匹配IP地址行 elsif ($line =~ /'ipaddress' => '(.*)'/) { $current_ip = $1; # 同时拿到名称和IP时,输出CSV行并重置变量 if ($current_name && $current_ip) { $csv->print(\*STDOUT, [$current_name, $current_ip]); ($current_name, $current_ip) = (undef, undef); } } } close $fh;
内容的提问来源于stack exchange,提问作者StayCalm
相关产品推荐
相关产品推荐

