You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:13:05