Perl脚本处理Cisco交换机文本文件的格式问题
解决Perl脚本解析Cisco交换机输出格式不一致的问题
嘿,我碰到过类似的Cisco设备输出格式不一致的坑!你遇到的问题核心应该是不同获取方式导致输出的换行/分隔逻辑不一样——比如你给的示例里,CPU负载统计和接口信息(Fa0/1 105...)直接挤在了同一行,而你的脚本大概率是按行解析的,自然就会忽略掉这部分内容。
下面给你几个实用的解决思路:
1. 先统一预处理输入文本
如果问题是换行缺失导致的,先把本该分隔的内容拆分成独立行,让脚本的原有逻辑能复用。比如针对你给出的格式,可以用正则把时间戳后的接口信息拆分出来:
open my $input_fh, '<', 'switch_data.txt' or die "Failed to open file: $!"; my $raw_content = do { local $/; <$input_fh> }; # 一次性读取整个文件 close $input_fh; # 在时间戳(比如"BST Tue Mar 27 2018")后面插入换行,拆分接口信息 $raw_content =~ s/(BST \w+ \d+ \d+) /$1\n/g; # 现在可以按行处理了 foreach my $line (split /\n/, $raw_content) { # 你的原有解析逻辑,比如匹配CPU负载或接口信息 if ($line =~ /Load for five secs: (\d+)%\/(\d+)%; one minute: (\d+)%; five minutes: (\d+)/) { print "5sec Load: $1%, 1min: $3%, 5min: $4%\n"; } elsif ($line =~ /(\w+\d+\/\d+) (\d+)\.\.\./) { print "Interface $1: $2\n"; } }
2. 增强正则匹配的灵活性(不依赖换行)
如果预处理还是覆盖不了所有格式差异,直接读取整个文件内容,用全局正则匹配来抓取目标信息,不管它们是否在同一行:
open my $fh, '<', 'switch_data.txt' or die "Can't open file: $!"; my $full_content = do { local $/; <$fh> }; close $fh; # 匹配CPU负载信息 if ($full_content =~ /Load for five secs: (\d+)%\/(\d+)%; one minute: (\d+)%; five minutes: (\d+)% Time source is (\w+), (.+?) BST (\w+ \d+ \d+)/) { my ($five_sec_load, $one_min_load, $five_min_load) = ($1, $3, $4); my ($time_source, $timestamp, $date) = ($5, $6, $7); print "=== CPU Stats ===\n"; print "5sec: $five_sec_load% | 1min: $one_min_load% | 5min: $five_min_load%\n"; print "Time Source: $time_source | Timestamp: $timestamp $date\n"; } # 全局匹配所有接口信息(支持同一行多个接口的情况) print "\n=== Interface Stats ===\n"; while ($full_content =~ /(\w+\d+\/\d+) (\d+)\.\.\./g) { print "$1: $2\n"; }
3. 排查获取方式的差异
顺便提一句,你可以检查下不同获取方式的输出差异:比如用show processes cpu直接输出和通过SNMP、远程终端(比如telnet/ssh)抓取的输出,换行符可能不同(比如有些是\r\n,有些是\n),或者终端宽度限制导致内容自动换行/合并。如果能从源头统一输出格式,会省很多事~
内容的提问来源于stack exchange,提问作者normbeef
相关产品推荐
相关产品推荐

