Andere Variante (ungetestet), direkt im Perl-Code zu verwenden:
my @IPs = map { my $f6 = (split m/\s+/, $_)[5]; ( split m/:/, $f6)[0] } qx/ss -4ntuh/;
Von rechts nach links lesen:
- Kommando
ss -4ntuh ausführen; Dessen Ausgabe wird zeilenweise gelesen (dank Listenkontext)
- map führt etwas für jedes Element der gegebenen Liste aus; hier also für jede Zeile
- - splitten der Zeile an Whitespaces; Übernahme des 6. Feldes nach $f6
- - Dann wird $f6 am : gesplittet; der erste Wert vor dem : ist die IP; dies liefert map dann zurück
- Die Ergebnisse werden dann dem Array zugewiesen
Achtung: Das funktioniert nur mit IPv4 Adressen! IPv6 Adressen verwenden den : auch; dann eher mit
s/:\d+$// den Port vom Ende abschneiden und hoffen, dass da immer ein Port steht.
Wenn Du sicher bist, dass in den Feldern vor Feld 6 keine ":" enthalten sind und Feld 6 *immer* eine Portangabe enthält, kannst Du es mit einem split() erledigen lassen:
my @IPs = map { (split m/[:\s]+/, $_)[5]; ) qx/ss -4ntuh/;
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!