PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [Perl] Probleme mit split



pertze
28-04-2006, 14:02
Hallo,

ich möchte über ein Perlskript die Ausgabe des UNIX Befehls "df" auswerten. Dazu habe ich folgenden Code:


my $COUNT = 0;
my @FS = ();

open(DF, "df |") or die "Fehler beim Forken von: $!\n";
while(<DF>){
if("$COUNT" gt 0){
my @TMP = split(/ /, $_);
push(@FS, $TMP[0]);
}
$COUNT++;
}
close(DF);

Mit diesem Konstrukt bekomme ich die Dateisysteme, also die erste Spalte von "df", in den Array @FS. Mein eigentliches Ziel ist es aber die letzte Spalte von "df", also die Mountpoints, in den Array zu bekommen.

Ich habe bei split ja als Trennzeichen ein Leerzeichen angegeben, aber die Leerzeichen bis zur zweiten Spalte von "df" sind ja variabel, also komme ich so nicht an die letzte Spalte ran. Zur Veranschaulichung nochmal die Ausgabe von "df":


Dateisystem 1K-Blöcke Benutzt Verfügbar Ben% Eingehängt auf
/dev/sda3 2016044 145808 1767824 8% /

Kann mir da jemand weiterhelfen?

Btw, ich hole mir in meinem Skript die Mountpoints noch durch eine zweite Schleife über "mount". Hier sind ja die Felder immer nur mit einem Leerzeichen getrennt. Aber ich würde gerne wissen, wie man die letzte Spalte schon bei "df" extrahiert.

Danke und Gruß,
pertze

mbscholz
28-04-2006, 14:36
Hi,

ich denke da kommst du mit Split nicht weiter, aber mit regulären Ausdrücken. Falls du die nicht kennst: Damit kann man Muster beschreiben, in diesem Fall bräuchte man also ein Muster dass den letzten Teil der Ausgabe erkennt. Das müsste ungefähr so aussehen:

$_ =~ /(\S*)$/

Erklärung: Durch die Klammern wird das gefundene in die Variable $1 geschrieben, und \S sagt dass das zu findende kein Whitespace sein soll (hoffe du hast sowas nicht in deinen Mountpoints) und durch den Stern nimmt er alle die er kriegen kann bis zum Zeilenende. Hier der komplette Code, bei mir funzt das so:



#!/usr/bin/perl -w

my $COUNT = 0;
my @FS = ();

open(DF, "df |") or die "Fehler beim Forken von: $!\n";
while(<DF>){
$_ =~/(\S*)$/;
print "Zeile: $_ -> $1\n";
}
close(DF);


Schönes WE!
Michael

pertze
28-04-2006, 15:32
Wow :eek: Vielen Dank, funktioniert!
Das nenn ich effektiv. Ich sehe schon, ich hab noch viel zu lernen bei Perl ;)

Gruß,
pertze