Thread RegEx für "ip addr show"
(14 answers)
Opened by cbxk1xg at 2021-02-23 16:07
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! |