将数据放入列中

将数据放入列中

我正在尝试将此输出放入列中,任何人都可以帮忙吗?

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""     }
   }'

对于不同的主机应根据字段数量进行修改。

相关内容