Probleme espace disque

Résolu
maI18 Messages postés 25 Date d'inscription   Statut Membre Dernière intervention   -  
maI18 Messages postés 25 Date d'inscription   Statut Membre Dernière intervention   -
bonjour,

Je souhaite récuperer la taille des partition de mon systeme en shell (espace libre, occupé, total).
Le probleme est que HP-UX me donne un résultat sous cette forme (suite à la commande df -k):

/home/adm (/dev/vg02/dmplv ) : 4998789 total allocated Kb
1893280 free allocated Kb
3105509 used allocated Kb

Or je ne sais pas comment récupérer ces résultats (sachant qu'il y a encore beaucoup de partitions qui suivent...).
Si vous pouvez m'aider ne vous gener pas !!!
Merci
A voir également:

21 réponses

mamiemando Messages postés 33778 Date d'inscription   Statut Modérateur Dernière intervention   7 884
 
C'est toujours la même chose ;) Tu chaines ta commande d'abord avec un grep (pour garder les bonne lignes donc cf cours sur les expressions régulières) et ensuite avec un awk (pour isoler les champs). Je peux pas t'en dire plus pour l'instant car pour l'instant je ne suis (malheureusement) pas sous linux.
0
maI18 Messages postés 25 Date d'inscription   Statut Membre Dernière intervention  
 
Merci de ta réponse mais... oui il y a un mais:

Le probleme est que je dois récupérer toutes les données d'une partition en une seule fois pour créer une ligne genre :

partition : /aaa libre : 12146 occupé 1213 total .........

De plus, il n'y a aucun moyen de fire un grep sur les lignes qui m'interessent car elle se ressemble toutes !!!

/home/adm (/dev/vg02/dmplv ) : 4998789 total allocated Kb
1893280 free allocated Kb
3105509 used allocated Kb
62 % allocation used
/home/lord (/dev/vg01/lordlv ) : 17776640 total allocated Kb
378152 free allocated Kb
17398488 used allocated Kb
97 % allocation used
/home (/dev/vg00/lvol5 ) : 3028736 total allocated Kb
660717 free allocated Kb
2368019 used allocated Kb
78 % allocation used
/home1 (/dev/vg02/home1lv ) : 10234528 total allocated Kb
2787174 free allocated Kb
7447354 used allocated Kb
72 % allocation used
/opt (/dev/vg00/lvol6 ) : 509305 total allocated Kb
40646 free allocated Kb
468659 used allocated Kb
92 % allocation used
/tmp (/dev/vg00/lvol4 ) : 577904 total allocated Kb
560883 free allocated Kb
17021 used allocated Kb
2 % allocation used
/usr (/dev/vg00/lvol7 ) : 1006092 total allocated Kb
313708 free allocated Kb
692384 used allocated Kb
68 % allocation used
/var (/dev/vg00/lvol8 ) : 500533 total allocated Kb
218893 free allocated Kb
281640 used allocated Kb
56 % allocation used
/stand (/dev/vg00/lvol1 ) : 75359 total allocated Kb
48398 free allocated Kb
26961 used allocated Kb
35 % allocation used
/ (/dev/vg00/lvol3 ) : 138963 total allocated Kb
66957 free allocated Kb
72006 used allocated Kb
51 % allocation used


Mais j'ai un début de solution (vraiment début), il faudrait que je puisse séléctionner les 4 premières lignes et toutes les mettre sur la même ligne...
De cette mainère avec un "awk" je pourrais obtenir tous ce qu'il me faut...
Merci quand même de ta réponse !
0
mamiemando Messages postés 33778 Date d'inscription   Statut Modérateur Dernière intervention   7 884
 
Je maintiens c'est faisable avec une expression régulière !! Si tu me disais les critères sur lesquels tu te base on pourrait faire une expression régulière (motif=critère suivi de 3 chaines séparées par un retour à la ligne).

Si c'est forcément les 4 premières lignes tu peux utiliser la commande head et ensuite faire un awk. Mais c'est nettement moins bon comme solution car le jour ou ce ne sera plus au début, ton script ne marchera plus...
0
jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 896
 
Salut,

Tu peux essayer avec un script du genre :
#!/bin/bash
# script.sh

#script de mise en forme de la sortie de la commande "df -k"

#définition des variables
count=`cat disque.txt | wc -l`
ligne1=1
ligne2=4

while [ "$ligne2" -le "$count" ];do
                sed -n "$ligne1","$ligne2"p disque.txt\
                | tr -d '\n'\
                | sed 's/Kb/Kb /g'\
                | awk ' { print "Partition : "$1," Libre : "$9," Occupé : "$13," Total : "$5,\
                " Pourcentage utilisation : "$17" %" } ' >> resultat.txt
                ligne1=$(expr $ligne1 + 4)
                ligne2=$(expr $ligne2 + 4)
done
Ce qui donne en partant d'un fichier "disque.txt" comme suit :
/home/adm (/dev/vg02/dmplv ) : 4998789 total allocated Kb
1893280 free allocated Kb
3105509 used allocated Kb
62 % allocation used
/home/lord (/dev/vg01/lordlv ) : 17776640 total allocated Kb
378152 free allocated Kb
17398488 used allocated Kb
97 % allocation used
/home (/dev/vg00/lvol5 ) : 3028736 total allocated Kb
660717 free allocated Kb
2368019 used allocated Kb
78 % allocation used
/home1 (/dev/vg02/home1lv ) : 10234528 total allocated Kb
2787174 free allocated Kb
7447354 used allocated Kb
72 % allocation used
/opt (/dev/vg00/lvol6 ) : 509305 total allocated Kb
40646 free allocated Kb
468659 used allocated Kb
92 % allocation used
/tmp (/dev/vg00/lvol4 ) : 577904 total allocated Kb
560883 free allocated Kb
17021 used allocated Kb
2 % allocation used
/usr (/dev/vg00/lvol7 ) : 1006092 total allocated Kb
313708 free allocated Kb
692384 used allocated Kb
68 % allocation used
/var (/dev/vg00/lvol8 ) : 500533 total allocated Kb
218893 free allocated Kb
281640 used allocated Kb
56 % allocation used
/stand (/dev/vg00/lvol1 ) : 75359 total allocated Kb
48398 free allocated Kb
26961 used allocated Kb
35 % allocation used
/ (/dev/vg00/lvol3 ) : 138963 total allocated Kb
66957 free allocated Kb
72006 used allocated Kb
51 % allocation used
Le résultat obtenu aprés traitement est le suivant:
cat resultat.txt
Partition : /home/adm  Libre : 1893280  Occupé : 3105509  Total : 4998789  Pourcentage utilisation : 62 %
Partition : /home/lord  Libre : 378152  Occupé : 17398488  Total : 17776640  Pourcentage utilisation : 97 %
Partition : /home  Libre : 660717  Occupé : 2368019  Total : 3028736  Pourcentage utilisation : 78 %
Partition : /home1  Libre : 2787174  Occupé : 7447354  Total : 10234528  Pourcentage utilisation : 72 %
Partition : /opt  Libre : 40646  Occupé : 468659  Total : 509305  Pourcentage utilisation : 92 %
Partition : /tmp  Libre : 560883  Occupé : 17021  Total : 577904  Pourcentage utilisation : 2 %
Partition : /usr  Libre : 313708  Occupé : 692384  Total : 1006092  Pourcentage utilisation : 68 %
Partition : /var  Libre : 218893  Occupé : 281640  Total : 500533  Pourcentage utilisation : 56 %
Partition : /stand  Libre : 48398  Occupé : 26961  Total : 75359  Pourcentage utilisation : 35 %
Partition : /  Libre : 66957  Occupé : 72006  Total : 138963  Pourcentage utilisation : 51 %
Les explications :
#!/bin/bash
# script.sh

# script de mise en forme de la sortie de la commande "df -k"

# définition des variables
# on récupère le nombre de ligne du fichier dans une variable
count=`cat disque.txt | wc -l`
# on initialise 2 variables pour délimiter les lignes (4 par 4)
ligne1=1
ligne2=4

# On boucle tant qu'on n'a pas atteint le nombre de ligne
while [ "$ligne2" -le "$count" ];do
        # on isole les lignes 4 par 4
        sed -n "$ligne1","$ligne2"p disque.txt\
        # on supprime le retour chariot pour n'avoir plus qu'une seule ligne (plus facile
        # pour isoler les champs avec "awk"
        | tr -d '\n'\
        # on ajoute un espace après "Kb" (petit inconvénient créé par la suppression
        # du retour chariot)
        | sed 's/Kb/Kb /g'\
        # puis on fini par formater le tout avec "awk" en récupérant les champs
        # qui nous intéressent
        | awk ' { print "Partition : "$1," Libre : "$9," Occupé : "$13," Total : "$5,\
        " Pourcentage utilisation : "$17" %" } ' >> resultat.txt
        # on incrémente le contage des lignes
        ligne1=$(expr $ligne1 + 4)
        ligne2=$(expr $ligne2 + 4)
done
;-))
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
maI18 Messages postés 25 Date d'inscription   Statut Membre Dernière intervention  
 
Whaou !!!
J'aurai jamais penser à un code pareil !!!
Je viens de le tester mais il ne fait rien...... je pense que ça vient de l'expression pour désigner les retour chariot...
ça ne m'affiche rien du tout dans resultat.txt.
Je vais tout de même essayer de trouver où ça foire (faut bien que je fasse quelque chose!).

Vraiment merci pour vos réponses et pour les explications de jipicy.

Je précise que le texte retourné par df -k ne change pas et sera toujours sous cette forme.
A+
0
jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 896
 
Salut,

Essaie avec une commande unique, sur une seule et même ligne d'abord, en prenant soin que le fichier "disque.txt" existe. Là, je récupère les ligne 25 à 28 :

sed -n '25,28p' disque.txt | tr -d '\n'| sed 's/Kb/Kb /g'|awk '{ print "Partition : "$1," Libre : "$9," Occupé : "$13," Total : "$5," Pourcentage utilisation : "$17" %" }'

Ou alors commence par tester des bouts de codes et agrémente au fur et à mesure que les tests sont positifs :

sed -n '25,28p' disque.txt | tr -d '\n'

Si ça marche :

sed -n '25,28p' disque.txt | tr -d '\n'| sed 's/Kb/Kb /g'

et ainsi de suite... ;-))
0
maI18 Messages postés 25 Date d'inscription   Statut Membre Dernière intervention  
 
C'est quand je veux supprimer le retour chariot que ça foire. Je mez demande si il peut supprimer ce "/n", ya t-il une autre expression pour ça?
0
jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 896
 
Attention !!!
Ce n'est pas "/n" (slash - n), mais "\n" (anti-slash - n).
Sinon essaye aussi avec "\r" (ça c'est le véritable retour chariot, l'autre c'est pour le saut de ligne).
0
maI18 Messages postés 25 Date d'inscription   Statut Membre Dernière intervention  
 
désolé, faute de frappe pour le \n.

je ne sais pas d'où vient l'erreur car si je cré un fichier qui contient:

azeazeaz
azeazeaz
sdsqdsd
puis je fais tr -d "\n" alors j'obtiens:

azeazeazazeazeazsdsqdsd

mais quand je le fais sur mon fichier ça ne fais rien....
0
jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 896
 
Re-

Ton fichier tu l'as créé je suppose à partir de :
df -k > mon_fich

Essaie de créer un fichier à partir d'un "Copier/Coller" de ça :
/home/adm (/dev/vg02/dmplv ) : 4998789 total allocated Kb
1893280 free allocated Kb
3105509 used allocated Kb
62 % allocation used
/home/lord (/dev/vg01/lordlv ) : 17776640 total allocated Kb
378152 free allocated Kb
17398488 used allocated Kb
97 % allocation used
/home (/dev/vg00/lvol5 ) : 3028736 total allocated Kb
660717 free allocated Kb
2368019 used allocated Kb
78 % allocation used
/home1 (/dev/vg02/home1lv ) : 10234528 total allocated Kb
2787174 free allocated Kb
7447354 used allocated Kb
72 % allocation used
/opt (/dev/vg00/lvol6 ) : 509305 total allocated Kb
40646 free allocated Kb
468659 used allocated Kb
92 % allocation used
/tmp (/dev/vg00/lvol4 ) : 577904 total allocated Kb
560883 free allocated Kb
17021 used allocated Kb
2 % allocation used
/usr (/dev/vg00/lvol7 ) : 1006092 total allocated Kb
313708 free allocated Kb
692384 used allocated Kb
68 % allocation used
/var (/dev/vg00/lvol8 ) : 500533 total allocated Kb
218893 free allocated Kb
281640 used allocated Kb
56 % allocation used
/stand (/dev/vg00/lvol1 ) : 75359 total allocated Kb
48398 free allocated Kb
26961 used allocated Kb
35 % allocation used
/ (/dev/vg00/lvol3 ) : 138963 total allocated Kb
66957 free allocated Kb
72006 used allocated Kb
51 % allocation used
et refait un :
cat fich | tr -d '\n'
et vois si ça marche. Ce pourrait être la façon dont la commande "df" formate sa sortie (une autre séquence d'échappement en fin de ligne ou un truc du genre)...
0
maI18 Messages postés 25 Date d'inscription   Statut Membre Dernière intervention  
 
oui ça marche comme ça mais le probleme vient peut-être du fait que ce n'est pas :

/home/adm (/dev/vg02/dmplv ) : 4998789 total allocated Kb
1893280 free allocated Kb
3105509 used allocated Kb
62 % allocation used

il y a des espaces sur les 3 dernieres lignes pour qu'elles se finnissent toutes à la même colone (quand je fais un copier coller ici ça ne me le prend pas...)

Même si ce ne sont que des espaces, ils peuvent (peu-être) être source d'erreur. De plus, lorsque je fais df -k | tr -d "\n" alors j'obtien:

/home/adm (/dev/vg02/dmplv ) : 4998790 total allocated Kb 1893273 free allocated Kb 3105517 used allocated Kb 62 % allocation used/home/lord
0
jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 896
 
Après ton :
df -k | tr -d '\n'
rajoute :
df -k | tr -d '\n' | sed 's/used\//used\n\//'
et dis moi si ça le fait ;-))
0
maI18 Messages postés 25 Date d'inscription   Statut Membre Dernière intervention  
 
ouf enfin ça marche presque...
En fait c'était la commande sed 's/Kb/Kb /g' qui faisait tout planter...
Mais je l'ai virée et c'est presque bon.

J'ai un autre probleme: (enfin je croi)

le nom de la partition c'est :
/home/adm (/dev/vg02/dmplv ) :

/home/adm ou /dmplv ???

parce queje fais un " cut" pour récupérer /dmplv mais il marche plus !!!
Je faisais des test, et puis maintenant ça ne marche plus... Je comprends rien, j'en ai vraiment marre d' Unix !

Je sais pas pourquoi il ne prend pas mes cut:

print "/home/adm (/dev/vg02/dmplv ) : 4998789 total allocated Kb 1893280 free allocated Kb 3105509 used allocated Kb 62 % allocation used" > test
cut -f 6- -d "/" < test
et là rien.....
0
jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 896
 
Essaie comme ça :

echo "/home/adm (/dev/vg02/dmplv ) : 4998789 total allocated Kb 1893280 free allocated Kb 3105509 used allocated Kb 62 % allocation used" | awk '{ print $2 }'| cut -d "/" -f 4
0
maI18 Messages postés 25 Date d'inscription   Statut Membre Dernière intervention  
 
Merci jipicy !

ça marche (enfin).
Mais j'ai un autre probleme.....:

crontab -l | grep -v \# > task
awk '{ print $6" "$5" "$3" "$4" "$2" "$1 }' < task > list

count=`cat list | wc -l`
ligne1=1

while [ "$ligne1 -le "$count" ];do

sed -n "$ligne1"p list | awk ' { tache= $6 ; jour= $5 ; moi= $4 ; num_jour= $3 ; heure= $2 ; min=$1 } '
echo $tache
ligne1=$(expr $ligne1 + 1)
done



Je veux mettre les différents mots de la ligne dans des variables mais ça ne marche pas (on ne peut pas utiliser awk de cette façon ?).
Y a t-il une erreur dans mon script ?
Merci de votre aide
0
jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 896
 
Salut,

Et si tu essayais tout simplement :
count=`cat list | wc -l`
ligne1=1

while [ "$ligne1" -le "$count" ];do

sed -n "$ligne1"p list | awk ' { print "tâche= "$6  "  jour= "$5 "  moi= "$4 "  num_jour= "$3  "  heure= "$2  "  min= "$1 } '
ligne1=$(expr $ligne1 + 1)
done 
J'ai rajouté un guillemet à "while [ "$ligne1" -le "$count" ]" qui manquait ;-))
0
jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 896
 
Pour une meilleure lisibilité (mise en page), tu peux reformuler la sortie de "awk" comme suit :
awk '{ printf "%s\t %s\t %s\t %s\t %s\t %s\n","tâche= "$6,"jour= "$5,"moi= "$4,"num_jour= "$3,"heure= "$2,"min= "$1 } '
;-)
0
maI18 Messages postés 25 Date d'inscription   Statut Membre Dernière intervention  
 
Oui mais ce que tu me donnes c'est pour afficher :
"tache .... jour..." non ?
alors que moi je veux mettre ça dans des variables.
0
jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 896
 
Tu peux préciser ta pensée là ???
Tu veux récupérer chaque mot ("tache = $1", "heure= $2" etc..) chacun dans une variable ou le résultat de la ligne entière dans une variable ???
0
maI18 Messages postés 25 Date d'inscription   Statut Membre Dernière intervention  
 
Non c'est bon en fait j'en ai aps besoin, je réfléchi pas assez avant d'agir !!!

Mais j'ai un truc bizare:

si je fais une boucle if dans une boucle if ça devrait marcher ex:

if .... then
...
else
if....then
....
else
if...
....
else
...
fi
fi
fi

ça devrait marcher non ?
Pourtant j'ai l'impression que ça ne séxécute pas correctement...
Désolé de faire de ce topic une foire aux questions, mais j'ai vraiment besoin d'aide !!!
0
jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 896
 
Essaie aussi avec "elif" :
if [ condition ]
then 
        action
elif [ condition2 ]
then
        action2
.
.
.
elif [ condition3 ]
then

else
        actionx
fi
Attention ici un seul couple "if <> fi"
0