我正在尝试将此输出放入列中,任何人都可以帮忙吗?
Routeur 2 ==> 89.89.156.112 If_Name
:vRtrIfName.1.1
:vRtrIfName.1.2
Routeur 2 ==> 89.89.156.112 If_index
546
789
Routeur 2 ==> 89.89.156.112 If_status
1
2
设计输出:
routerName IPadd If_Name If_index If_status
Routeur 2 89.89.156.112 :vRtrIfName.1.1 546 1
Routeur 2 89.89.156.112 :vRtrIfName.1.2 789 2
答案1
Perl 解决方案,使用文本::表为了获得良好的输出格式:
#!/usr/bin/perl
use warnings;
use strict;
use Text::Table;
my %t;
my ($router, $ip, $column);
while (<>) {
if (/==>/) {
($router, $ip, $column) = /(.*) ==> ([0-9.]+) (\S+)/;
} else {
chomp;
push @{ $t{$router}{$ip}{$column} }, $_;
}
}
my @columns = qw( If_Name If_index If_status );
my $tt = 'Text::Table'->new('routerName', 'IPadd', @columns);
for my $router (keys %t) {
for my $ip (keys %{ $t{$router} }) {
for my $i (0 .. $#{ $t{$router}{$ip}{ $columns[0] } }) {
my @values = map $t{$router}{$ip}{$_}[$i], @columns;
$tt->add($router, $ip, @values);
}
}
}
print $tt;
答案2
awk解决方案
awk '
/Routeur/{
i=0;
host[$1" "$2]=$4;
k++;
param[k]=$5;
next }
{
i++
Data[k,i]=$0
}
END{
printf("%-12s%-15s","routerName","IPadd");
for(j in param)
printf("%-17s",param[j]);
print "\n";
for(h in host)
for(i=1;i<3;i++){
printf("%-12s%-15s",h,host[h]);
for(j in param)
printf "%-17s", Data[j,i];
print"" }
}'
对于不同的主机应根据字段数量进行修改。