Récupérer commande dans un fichier texte

uniq'x -  
 uniq'x -
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.

5 réponses

  1. uniq'x
     
    le formatage du forum supprime les lignes vides présentes avant et après m dans le fichier test1.txt
    0
  2. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
     
    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
  3. uniq'x
     
    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
    1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      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
    2. uniq'x
       
      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
  4. Utilisateur anonyme
     
    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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. uniq'x
     
    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
    1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      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
    2. Utilisateur anonyme
       
      awk sait faire des recherches de motifs, 'grep' est inutile.
      top -bn1 | awk '/^Mem/{ print $2}'
      0
    3. uniq'x
       
      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
    4. uniq'x
       
      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