Récupérer commande dans un fichier texte

Fermé
uniq'x - 17 févr. 2012 à 16:41
 uniq'x - 18 févr. 2012 à 17:43
Bonjour,

J'ai un fichier texte (test.txt) formaté de la façon suivante:

memoire.cmde=free
memoire.opts=m
memoire.args=
memoire.thr=20%

J'aimerais écrire un script qui permettrai le transformer en ligne de commande dans un ficher intermédiaire (test1.txt) comme suit :

$ free -m

le memoire.thr=20% permettra plus tard de déclencher une alerte quand la mémoire libre est inférieur à 20%.
Enfin, le script devra interpréter le fichier test1.txt et exécuter la commande free et l'afficher.

voici le peu de ligne de code que j'ai écrit pour le moment :

#! /bin/bash

awk '{FS="="}{print $2}' test.txt > test1.txt

mon fichier test1.txt est de la forme suivante:


m

20%

Comment puis je faire pour avoir:
- le free qui soit pris en compte ?
- la ligne de commande $ free -m dans mon test1.txt ?

Merci à tous pour votre aide.

A voir également:

5 réponses

le formatage du forum supprime les lignes vides présentes avant et après m dans le fichier test1.txt
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 408
17 févr. 2012 à 17:47
Salut,

Déjà, le nom des variables ne doivent pas contenir de point ;-\
À remplacer par un underscore (ma_variable).

Pour prendre en compte des variables contenues dans un autre fichier, il faut "sourcer" ledit fichier (commande 'source' ou '.').

Pour interpréter une commande contenue dans une variable il faut "évaluer" ladite variable (commande 'eval').

Mise en application :

$ ls
foo.sh*  test.txt

$ cat test.txt 
memoire_cmde=free
memoire_opts=m
memoire_args=
memoire_thr=20%

$ cat foo.sh 
#! /bin/bash

source test.txt

eval ${memoire_cmde} -${memoire_opts} > test1.txt



$ ./foo.sh 

$ ls
foo.sh*  test1.txt  test.txt

$ cat test1.txt 
             total       used       free     shared    buffers     cached
Mem:         16062       3595      12467          0        119       2095
-/+ buffers/cache:       1380      14682
Swap:         3992          0       3992

$

;-))
0
salut Zipe,

merci beaucoup pour ta réponse complète qui m'a bien dépatouillée.

Selon toi il est vraiment impossible d'avoir des variables avec un point dedans ?
A tout hasard, est ce que tu connaitrais l'équivalent de la commande free sur Mac car c'est le matériel que j'utilise? et si oui, est ce que tu sais comment je peux extraire une variable du résultat de la commande en question, par exemple la mémoire totale, pour faire un calcul avec par la suite?

Encore merci pour ton aide.
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 408
17 févr. 2012 à 19:59
Mac je ne connais pas, mais comme c'est à base d'Unix, je suppose que la commande "free" existe aussi ;-))

Quand à extraire une partie du fichier, awk est ton ami :

$ cat test1.txt 
             total       used       free     shared    buffers     cached
Mem:         16062       3559      12503          0        121       2096
-/+ buffers/cache:       1341      14721
Swap:         3992          0       3992

$ awk '/^Mem:/ { print $2}'  test1.txt 
16062

$ 

;-))
0
Justement il ne la connait pas. la seule réponse qu'il me mette suite à man free c'est pour faire des allocations dynamiques de mémoire, du type malloc, alloc...

Très bien vu le coup du awk, j'arrive pas à me mettre en tête qu'il travaille avec des tableaux.

Merci
0
Utilisateur anonyme
18 févr. 2012 à 00:37
salut,

Ici, 'eval' n'est pas nécessaire.
cat >cmde.txt
cmde=free
opt='-m'
^D
cat > exeCmdetxt
#!/bin/bash
. ./cmde.txt
$cmde $opt
^D
chmod u+x exeCmdetxt
./exeCmdetxt
             total       used       free     shared    buffers     cached
Mem:         16062       3559      12503          0        121       2096
-/+ buffers/cache:       1341      14721
Swap:         3992          0       3992
si 'free' n'est pas disponible, peut-être y a-t-il quand même un fichier /proc/meminfo
awk '/^MemTotal/{printf("%d Mo\n", $2/1024}' /proc/meminfo
0

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

Posez votre question
Merci à tous pour vos aides.

En fait le meilleur moyen pour obtenir les informations sur la mémoire vive du Mac est de faire un top et avec un grep sur Physmem et un awk on peut obtenir la mémoire libre.

Voici la ligne de commande :

#! /bin/bash

top -l 1 | grep PhysMem: | awk '{print "La memoire libre est de :" $10}'

Cependant je me retrouve face à un nouveau problème, mineur je pense, quand j'exécute mon script, le curseur retourne à la ligne et je suis obligé de faire un Ctrl+C pour arrêter l'exécution et avoir la réponse. Je pense que celà vient des options du top.

Si quelqu'un a une idée ?
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 408
18 févr. 2012 à 12:58
man top :

       -b : Batch mode operation
            Starts  top  in  'Batch mode', which could be useful for sending output from top to other programs or to a
            file.  In this mode, top will not accept input and runs until the iterations limit  you've  set  with  the
            '-n' command-line option or until killed.
0
Utilisateur anonyme
18 févr. 2012 à 13:17
awk sait faire des recherches de motifs, 'grep' est inutile.
top -bn1 | awk '/^Mem/{ print $2}'
0
je ne comprends pas pourquoi une fois de plus je n'ai pas l'option -b sous Mac OS X.

Voici où j'en suis actuellement :

#! /bin/bash
memoire_cmde=top
memoire_opts=o
memoire_args=vsize

echo $memoire_cmde #Ces trois lignes vérifient qu'il prend bien les bons arguments
echo $memoire_opts
echo $memoire_args

eval ${memoire_cmde} -${memoire_opts} ${memoire_args} > test1.txt
awk '/^PhysMem:/ {print "La memoire libre est de :" $10}' test1.txt


Peux tu me dire ce que ton terminal t'affiche après l'exécution de ce script? merci à toi
0
J'ai trouvé comment résoudre mes problèmes de champs mémoire à extraire.
J'ai donc mis ces deux données dans deux variables distinctes et j'aimerais maintenant effectuer un calcul avec la valeur de ces deux variables, en l'occurrence un calcul de pourcentage.

Faut il convertir ces chaines de caractères en entiers ?
merci
0