Thread RegEx für "ip addr show" (14 answers)
Opened by cbxk1xg at 2021-02-23 16:07

Linuxer
 2021-02-23 20:26
#193137 #193137
User since
2006-01-27
3870 Artikel
HausmeisterIn

user image
Hi,

ohne große weitere Optimierung, hier ein Ansatz:

Öffne eine Pipe zum Kommando und lese zeilenweise aus der Pipe.
Dann kannst Du zeilenweise die Werte der einzelnen Interfaces auslesen und abspeichern.

Einfaches Beispiel unter Verwendung Deiner Regex:

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#! /usr/bin/env perl
use strict;
use warnings;
use Data::Dumper;

my $cmd = "ip addr show";

my %interface;

open my $pipe, '-|', $cmd or die "(E) could not execute: $cmd: $!\n";
while ( my $line = <$pipe> ) {

        if ( $line =~ m/(\d{1,2}\: (.+)\: \<(.+)\>.*mtu (\d+).*state (UP|DOWN|UNKNOWN).*\n.*|\n.*inet (\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\/\d{1,2})/ ) {

                $interface{$2}->{link} = $1;
                $interface{$2}->{abilities} = $3;
                $interface{$2}->{mtu} = $4;
                $interface{$2}->{state} = $5;
        }

}

close $pipe;

warn Dumper \%interface;



Edit:

Ich habe meine Version nochmal überarbeitet:

Das setzt auf weniger komplexe Regex:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#! /usr/bin/env perl
use strict;
use warnings;
use Data::Dumper;

my $cmd = "ip addr show";

my %interface;

open my $pipe, '-|', $cmd or die "(E) could not execute: $cmd: $!\n";

my $int;
while ( my $line = <$pipe> ) {

        if ( $line =~ m/^\d+:\s+([^:]+): <([^>]+)>/ ) {
                $int = $1;
                $interface{$int}->{abilities} = $2;
        }

        while ( $line =~ m/(mtu|state|inet6?) (\S+)/g ) {
                $interface{$int}->{$1} = $2;
        }
}

warn Dumper \%interface;

close $pipe;

Last edited: 2021-02-23 20:50:54 +0100 (CET)
meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen!

View full thread RegEx für "ip addr show"