df parameter einzeln auslesen

A

alin.r

Grünschnabel
Hallo,

wahrscheinlich eine recht triviale Geschichte, für mich jedoch momentan unlösbar.
Ich möchte in ein Shell Script den Befehlt df ausführen. Vom Ergebnis möchte ich lediglich das Device und die Belegung ausgeben.
Also irgendwie in der art:

$var1 = df[device]
$var2 = df[belegung in %]

Über eine Antwort würde ich mich sehr freuen.

Grüße
Alin
 
Also zuerst kannste die entsprechende Zeile mittels grep rausholen
und dann mit cut auf die einzelnen Spalten losgehen.
 
Hallo
Schnellschuss mit perl ;)
Code:
df -P |perl -anle 'print "Device: $F[0]\t $F[4]" if (/^\//)'
Je nach deinem System, kennt df die Option -P für überlange Zeilen.

Natürlich geht das auch mit cat grep awk oder sed...

Gruß Wolfgang
 
vielen Dank euch beiden.
Ich habe mich für die version von Wolfgang entschieden, da ich bei der bash programmierung absoluter neuling bin.
Ein kleines Problem noch:
Wie kann ich die print-Anweisung durch eine variablenzuweisung ersetzen?
Also nicht
'print "Device: $F[0]\t $F[4]" if (/^\//)'
sondern irgendwas in der richtung
$var1 = $F[0]
$var2 = $F[4]

Ihr seht ein absoluter Neuling.
Vielen Dank für eure Geduld
Alin

Nachtrag:
das hat hier so funktioniert:
var1=`df | perl -anle 'print "$F[4]" if(/^\^//)'`
 
Zuletzt bearbeitet:
Hallo

Verstehe zwar nicht ganz, was du noch mit dien Variablem machen willst?
Du sprachst von Ausgeben, genau das macht mein Einzeiler.

Aber wenn du es doppelt gemoppelt magst geht auch das mit o.g. Einzeiler. ;)
Code:
df -P |perl -anle 'print "$F[0] $F[4]" if (/^\//)'|while read VAR1 VAR2;
 do
 echo "Ich bin VAR1 $VAR1";
 echo  "Ich bin VAR2 $VAR2";
done
Sei dir aber Bewusst:
- dass bei jeder Zeile beide Variablen neu belegt werden.
- dass du Variablen, die du in einem Perlprozess belegst, für die Shell unsichtbar sind.

Du kannst natürlich auch zeilenweise sed oder awk oder cut verwenden, um die ausgegebenen Werte einer Variable zu zu weisen.
Nur jeder zusätzliche Prozess ist eine Performancebremse.
Das spielt zwar hier weniger eine Rolle, ist aber dennoch guter Stil.
Gruß Wolfgang
 
slasher schrieb:
er schrieb von Ausgaben und das hier:

und über eine Antwort würde er sich freuen :).
Für mich war das irgendwie verständlich genug *kopfkratz*.
Hallo @slasher
Und was trägt dein Beitrag zur Klarstellung bei? *kopfkratz*.

Mein erster Lösungsvorschlag bezog sich auf genau die vorher erstellte erste
Frage:
Hallo,

wahrscheinlich eine recht triviale Geschichte, für mich jedoch momentan unlösbar.
Ich möchte in ein Shell Script den Befehlt df ausführen. Vom Ergebnis möchte ich lediglich das Device und die Belegung ausgeben.
Also irgendwie in der art:

$var1 = df[device]
$var2 = df[belegung in %]

Über eine Antwort würde ich mich sehr freuen.

Die zweite Frage habe ich auch beantwortet.
Du allerding nicht.

Gruß Wolfgang
 
Und was trägt dein Beitrag zur Klarstellung bei? *kopfkratz*.
ja, nichts, aber mir ist aufgefallen, dass du dich immer öfter wegen irgendeinem Krümel muckierst :). So schlimm kann dein Leben doch garnicht sein :). Ok, die Sonne scheint hier gerade nicht, aber das kommt noch.

Die zweite Frage habe ich auch beantwortet.
deine Kompetenz und die Richtigkeit deiner Antworten wurde nicht in Frage gestellt, weswegen ich mich aber umsomehr über dein Verhalten gegenüber $OP wundere :). Nicht mehr und nicht weniger.
 
Zur letzten Klarstellung:
Jemand fragt nach einer Lösung, wie er etwas ausgeben kann.
Ich antworte eine Lösung.
Die zweite Frage ergibt etwas anderes, wobei mir deshalb nicht ganz klar ist, was nun wirklich gewollt ist.
Ich frage also rein sachlich (nicht unfreundlich) nach was nun gewollt ist, antworte aber auch darauf.

Wo ist nun dein Problem slasher?
Was war denn der Sinn deines Postings?

Lehn dich mal zurück und denk in Ruhe darüber nach. ;)

Gruß Wolfgang
 
Hi Alin

Meines Wissens ist es mit Bash Bordmitteln nicht möglich, eine Zeile auseinanderzunehmen in die einzelnen Felder. Tools wie "cut" und "awk" sind da die besten Mittel hierfür.

Gruss
Joel
 
@Wolfgang:
Wo ist nun dein Problem slasher?
Was war denn der Sinn deines Postings?
Dich auf etwas hinzuweisen (s.o.).

Ich antworte eine Lösung.
und nochmal: niemand stellt deine Kompetenz in Frage :). Wenn du dieses Gefühl haben solltest, versuche es abzustellen :).

Ich frage also rein sachlich (nicht unfreundlich) nach was nun gewollt ist, antworte aber auch darauf.
klingt aber unfreundlich, da du es aber anscheinend nicht unfreundlich meinst, hat sich das hier auch schon wieder erledigt.

Lehn dich mal zurück und denk in Ruhe darüber nach.
nein, zurücklehnen geht nicht, da man dann auf die Idee kommen könnte, dass ich nichts mache. Schreibe ich aber fleißig an diesem Keyboard, denken alle, dass ich extrem beschäftigt bin ;).
 
Das Device bekommt man mit
Code:
df -a | grep /dev/hdaX | awk '{print $1}'
Den Prozentwert fuer die Belegung wirst du berechnen muessen, wozu du die Daten von
Code:
df -a | grep /dev/hdaX | awk '{print $3}' # benutzter Festplattenplatz
und
Code:
df -a | grep /dev/hdaX | awk '{print $4}' # verfuegbarer Platz
nutzen kannst. Die Befehle sollte in jedem Shell-Skript nutzbar sein. hdaX muss hier natuerlich durch das von dir gewuenschte Device ausgetauscht werden.
 
Hallo
Code:
df -P |sed -e '1!d'|while read v1 v2 v3 v4 v5 v6; do echo -e "$v1 \t $v5"; done
;)
Gruß Wolfgang
 
Ah, -P war die Option fuer den Prozentwert. (Dank @Wolfgang :) ) Dann kommt man an den Prozentwert auch mit
Code:
df -P | grep hdaX | awk '{print $5}'
 
@ slasher:

Dein Einsatz für Forenneulinge in allen Ehren. Wenn man aber eine Aufgabenstellung bekommt, dann sich 5 Minuten hinsetzt, um eine Lösung zu finden, nur um sie anschliessend zu verwerfen, weil es doch anders gemeint war, dann kann das schon ärgerlich sein.

Gruss, Xanti
 
theton schrieb:
Ah, -P war die Option fuer den Prozentwert. (Dank @Wolfgang :) ) Dann kommt man an den Prozentwert auch mit
Code:
df -P | grep hdaX | awk '{print $5}'
Hallo
Es kommt darauf an, welches df verwendet wird.
Auszug aus meinem hier verwendeten df:
df (coreutils) 5.2.1


-P, --portabilit
Verwendung des POSIX-Ausgabeformates.

Das hat z.B. Auswirkung auf lange Zeilen, so dass diese nicht umgebrochen werden.

Gruß Wolfgang
 
Xanti schrieb:
@ slasher:

Dein Einsatz für Forenneulinge in allen Ehren. Wenn man aber eine Aufgabenstellung bekommt, dann sich 5 Minuten hinsetzt, um eine Lösung zu finden, nur um sie anschliessend zu verwerfen, weil es doch anders gemeint war, dann kann das schon ärgerlich sein.

Gruss, Xanti

ach, wolle schüttelt das doch, wie immer, mal ebend aus dem Ärmel :), aber ich versteh, was du meinst und kann es auch verstehen. Die Sache ist unwichtiger, als es hier rüberzukommen scheint :). Donnerstag soll das Wetter wieder besser werden und ich freu mich schon darauf.
 
Also erstmal vielen dank für die vielen Antworten die ich bekommen habe.
Ich wollte niemand auf den Schlipps tretten. Ich wusste nur eben nicht wie ich das ganze angehen sollte, bin eben noch Neulling. Aber einige von euch haben recht, ich sollte von Anfang an das Problem ausführlich beschreiben.

Hier nochmal die komplette Aufgabenstellung, diesmal hoffentlich ausführlich genug beschrieben.

Ich möchte ein Shell Skript bauen, welches zuerst die Belegung der Platte ausliest. Wenn die Belegung größer als 75% ist, soll eine E-Mail an drei E-Mail Adressen gesendet werden.

Die meisten werden darüber lachen, für mich als Neuling ist es eben ziemlich kompliziert.
Ich habe es bis jetzt geschafft die Werte für genutzten Platttenplatz auszulesen. Wie es mir aber erscheint ist das ein String und somit kann ich leider kein >= Vergleich mit einem Int-Wert anstellen.
Daran hapert es im Moment.
Vielen Dank nochmal an alle, die sich mein Problem angenommen haben, für eure Zeit und Geduld.

Schöne Grüße
Alin
 
Hallo alin.r

Hab das selbe auch gemacht...

Hier kannst dir mein Script ja mal anschauen, aber sei gewarnt, das ganze ist ein Schnellschuss, mit er einen oder anderen Unschönheit, aber es tut seinen Zweck.
Vielleicht kannst dus ja ein bisschen optimieren...

Code:
#!/bin/bash
#	j-fu apr.2006
#	v.0.1
#	
#	Alarmiert per Mail wenn eine Festplatte
#	ein Füllgrad von mehr als 90% erreicht
#	

#Dateien definieren
DF_TXT=/tmp/${$}.txt
DF_SED=/tmp/${$}.sed
DF_SED_HELP=/tmp/${$}_help.sed
THRESHOLD=90

SENDMAIL=/usr/lib/sendmail


#Alarmmail-Funktion
alertMail ()
{
	MAIL_FILE="/tmp/ts_mail.txt"
	echo "From: !HIERABSENDER!" > $MAIL_FILE
	echo "Subject: Achtung Mountpoint $1 läuft voll!" >> $MAIL_FILE
	echo "$1 ($3) ist zu $2 voll (nur noch $4 frei)." >> $MAIL_FILE
	echo "`date '+%d.%b.%y %H:%M:%S'`" >> $MAIL_FILE
	echo " " >> $MAIL_FILE
	echo "Mail ausgelöst durch $0" >> $MAIL_FILE
	echo . >> $MAIL_FILE
	$SENDMAIL adresse@nummer0.test < $MAIL_FILE
	$SENDMAIL adresse@nummer1.test < $MAIL_FILE
	$SENDMAIL adresse@nummer2.test < $MAIL_FILE
	rm $MAIL_FILE
}

#Ausgabe von 'df -h' in File schreiben
df -h > $DF_TXT 

#Erste Zeile entfernen
sed '1d' $DF_TXT > $DF_SED

#Anzahl der Mountpoints (Anzahl Zeilen) speichern
LINE_COUNT=`wc -l $DF_SED | awk '{print($1)}'`

#Mache fuer jeden Mountpoint (jede Zeile)
while [ $LINE_COUNT -gt 0 ]
do
	#Prozentzahl aus der ersten Zeile als reine Zahl heraustrennen
	PERCENT=`head -n 1 $DF_SED | awk '{print($5)}' | tr -d '[%]'`
	
	#Wenn die Prozentzahl groesser als $THRESHOLD ist
	if [ $PERCENT -gt $THRESHOLD ]
	then
		#Sende ein Mail mit folgenden Informationen:
		           #1: Name des Mountpoints                #2: Füllgrad in %                       #3: Name der Partition (/dev/dsk/...)   #4: Freier Platz in Byte (KB,MB,GB)
		alertMail `head -n 1 $DF_SED | awk '{print($6)}'` `head -n 1 $DF_SED | awk '{print($5)}'` `head -n 1 $DF_SED | awk '{print($1)}'` `head -n 1 $DF_SED | awk '{print($4)}'`
	fi
	
	#Die oberste Zeile der 'df -h' List löschen und in Hilfsfile schreiben
	sed '1d' $DF_SED > $DF_SED_HELP
	#Hilfsfile wieder in Hauptfile zurück schreiben
	cat $DF_SED_HELP > $DF_SED
	#Linecout um 1 erhöhen
	LINE_COUNT=$(( $LINE_COUNT - 1 ))
done

rm $DF_TXT
rm $DF_SED
rm $DF_SED_HELP

exit

Gruss
d22
 
Moin,

das wurde wohl schon tausendmal implementiert. Bevor man jetzt hier das Rad neu erfindet, vielleicht das hier:

Code:
#! /bin/bash
#
# plattenplatz.sh überwacht den Plattenplatz
#
# (C) Michael Wirth <wirth@linux-install.de>
#
# Lizenz: GPLv2

PATH=/bin:/sbin:/usr/bin:/usr/sbin
TMPFILE=`mktemp /tmp/df.XXXXXXXXXX`

df -l | tail +1 > ${TMPFILE}

while read device devsize usedsize freesize percent filesys ;
do
        MYPERCENT=`echo $percent | cut -d% -f1` ;
        echo "$filesys auf $device ist zu $percent Prozent belegt"
done < ${TMPFILE}

exit

Grüße
 

Ähnliche Themen

Shell CGI Script soll Sytemvariablen Schreiben und auslesen

Server-Monitoring mit RRDTool

Zurück
Oben