Script Shell

Script Shell - Shell/Batch - Programmation

Marsh Posté le 23-05-2005 à 14:58:07    

J'aimerais créer un script en Shell qui permetrait de récuperer des informations dans un fichier .txt
En fait, le sujet est le suivant :
Je récupere la température grâce à une sonde et je l'affiche sur un graphique avec le logicielle rrdtool. Un script checktemp.sh permet en fait de recuperer la date et la temperature d'o* les fichiers date.txt et temp.txt
J'aimerai donc avoir un script qui permettrai de récuperer la date et la temperature de ces fichiers txt
Débutant sous Linux, désolé si ma question n'est pas très explicite. Je reformulerai selon vos demandes.

Reply

Marsh Posté le 23-05-2005 à 14:58:07   

Reply

Marsh Posté le 23-05-2005 à 15:02:21    

Uh huh.
 
Bien évidemment, tout le monde ici connait le format du fichier texte dont tu souhaites extraire les données.
 
Quoiqu'il en soit, selon le format du fichier, tu peux réaliser ceci soit en coordonnant les commandes "cat" et "cut", soit en utilisant "awk".

Reply

Marsh Posté le 23-05-2005 à 15:16:02    

En fait, j'aimerais savoir de quelle facon mon script doit etre structuré. Admettons que dans le fichier temp.txt il y a 25.2° et dans date.txt 23 May 2005. Comment faire ? Merci

Reply

Marsh Posté le 23-05-2005 à 15:38:23    

Je ferais bien un truc comme ça, si c'est du ligne à ligne (dans le cas contraire, utiliser la commande 'join') :
 

Code :
  1. #!/bin/ksh
  2. i=1
  3. for temperature in `cat temp.txt`; do
  4.    dateReleve=`head -$i date.txt | tail -1`
  5.    i=`expr $i + 1`
  6.    # ici, on a dans $dateReleve et dans $temperature
  7.    # les infos dont on a besoin, avec pour chaque
  8.    # $dateReleve la $temperature correspondante
  9. done


 
Il y a peut-être une méthode plus propre.


Message édité par Elmoricq le 23-05-2005 à 15:39:53
Reply

Marsh Posté le 24-05-2005 à 10:35:31    

MErci pourton aide mais ça ne marche pas. J'ai donc testé avec awk, je pense que c'est avec cette commande qu'il faut faire mais j'ai une erreur.
Voici mon script

Code :
  1. #!/bin/ksh
  2. $temp = "awk '{print $2}' lasttemp.txt
  3. awk '{print $1}' lastdate.txt


 
La deuxieme ligne fonctionne, normal, mais c'est au niveau de la premiere, j'aimerai recuperer la variable $temp
 
Erreur affichée
 
./relevetemp.sh: line 2: =:command not found
 
J'ai essayé plusieurs syntaxes mais je n'arrive pas a garder la variable
 
Merci de votre aide

Reply

Marsh Posté le 24-05-2005 à 11:04:42    

Citation :

MErci pourton aide mais ça ne marche pas.


 
Si.
Tu as dû mal recopier, notament au niveau des backquotes d'exécution (caractères ALT-GR + 7 : `).
Ou alors, il y a quelque chose que tu n'as pas dit au niveau du format des fichiers.
 
 

Citation :

La deuxieme ligne fonctionne, normal, mais c'est au niveau de la premiere, j'aimerai recuperer la variable $temp


 
Tout d'abord, c'est pas des double-quotes qu'il faut mettre ici, mais des backquotes.
Ensuite, si tu as mis "$2" c'est, j'imagine, parce que la température est sur la deuxième colonne de données de ton fichier ?  
Si oui, alors évidemment on ne peut pas t'aider si tu persistes à ne pas indiquer le format des fichiers que tu traites.
Si non, alors pourquoi "$2" ?
 
Et apparemment, si awk fonctionne comme tu le souhaites, c'est qu'il n'y a qu'une seule ligne dans tes fichiers ?  
Si c'est ça, c'est encore un truc que tu n'as pas dit sur tes fichiers.
Si non, alors tu es au courant que ta variable contiendra toute la première colonne de ton fichier ?

Reply

Marsh Posté le 24-05-2005 à 11:31:11    

Alors, ce sont des fichiers au format .txt
Ils ne contiennent qu'une seule ligne car le fichier est mis a jour toutes les minutes, donc les données sont a chaque fois ecrasées.
Je met ici ce que contient le fichier lasttemp.txt
 
Tue May 24 11:43:03 CEST 2005
 
Et ici le fichier lasttemp.txt
 
-temperature: 28.50 , Celsius
 
Voici ce que contiennent mes fichiers.
 
Merci de ton aide Elmoricq

Reply

Marsh Posté le 24-05-2005 à 12:07:01    

Dans ces cas là, c'est extrêmement simple, et la boucle que j'ai mise est inutile (et erronée mais, eh, je ne pouvais pas le savoir).
 
Pour la date, tu veux la récupérer dans un format particulier, ou telle qu'elle est dans le fichier ?
 
Exemple pour une date récupérée au format dd MMM yyyy :

Code :
  1. #!/bin/ksh
  2. maDate=`awk '{ printf("%s %s %s",$3, $2, $6) }' lastdate.txt`
  3. temperature=`awk '{ print $2 }' lasttemp.txt`
  4. # Ou, si on veut varier un peu les plaisirs :
  5. # temperature=`cat lasttemp.txt | cut -d' ' -f2`


 
Et pour le cas où tu voudrais la date telle quelle :

Code :
  1. #!/bin/ksh
  2. maDate=`cat lastdate.txt`
  3. temperature=`awk '{ print $2 }' lasttemp.txt`


 
 
Fais attention aux quotes lorsque tu recopies, de façon à ne pas confondre les quotes simples (car. ' : chaîne de caractères non interprétée par le shell), les doubles quotes (car. " : chaîne de caractères dont le contenu est interprété), et les backquotes (car. ` : chaîne exécutée dans un sous-shell)

Reply

Marsh Posté le 24-05-2005 à 13:21:48    

Nikel, ca marche !  :bounce:


Message édité par calimero_06 le 24-05-2005 à 13:46:37
Reply

Marsh Posté le 24-05-2005 à 13:55:33    

J'ai une autre question maintenant : je voudrais envoyer un mail si le seuil de temperature est depassé.
J'ai donc ca pour le moment :
 

Code :
  1. #!/bin/ksh
  2. alert=30
  3. date=`awk '{ printf("%s %s %s",$3, $2, $6) }' lastdate.txt`
  4. temp=`awk '{ print $2 }' lasttemp.txt`
  5. if [$temp > $alert]
  6. mail -s "alerte !!!" mail@fournisseur.com"
  7. fi


Pour la suite je bloque  :sweat:


Message édité par calimero_06 le 24-05-2005 à 14:21:18
Reply

Marsh Posté le 24-05-2005 à 13:55:33   

Reply

Marsh Posté le 24-05-2005 à 14:39:43    

Le test n'est pas bon.
Il faut impérativement un espace entre ce qu'il y a entre les crochets, et les crochets eux-mêmes.
 
De plus, pour tester des numériques, il faut utiliser les opérateurs type -eq (equal), -ne (not equal), -lt (lower than), -le (lower or equal), -gt (greater than), -ge (greater or equal)
 
Ensuite, ton if n'est pas bon : il doit être suivi de "then".
 
Enfin, il faut savoir que "mail" lit le message à envoyer sur l'entrée standard. Tu dois donc user de redirections pour parvenir à tes fins.
Ici, on va demander au shell de rediriger un bloc de texte jusqu'à rencontrer le mot "EOMAIL" (c'est personnel, mais j'utilise toujours "EO(quelque chose)" pour dire : "End Of ..." ; on peut choisir le délimiteur que l'on veut)
 
Ce qui donne donc :    
 

Code :
  1. #!/bin/ksh 
  2.    
  3. alert=30
  4. date=`awk '{ printf("%s %s %s",$3, $2, $6) }' lastdate.txt` 
  5. temp=`awk '{ print $2 }' lasttemp.txt`
  6. if [ $temp -gt $alert ]
  7. then
  8.    mail -s '[ALERTE] Seuil de température dépassé' mail@fournisseur.com" <<EOMAIL
  9.       Seuil d'alerte dépassé.
  10.       Date du relevé : $date
  11.       Température : ${temp}°C
  12. EOMAIL
  13. fi


 
 
EDIT : pour le mot marquant la fin de la redirection, celui-ci doit obligatoirement débuter en début de ligne. Pour ça que le mot "EOMAIL" n'est pas indenté comme le reste dans le code que j'ai écrit. Y a moyen de faire autrement, mais pour le moment je pense qu'il serait bon de s'en tenir là ;)


Message édité par Elmoricq le 24-05-2005 à 14:46:12
Reply

Marsh Posté le 24-05-2005 à 14:57:45    

La poste sur lequel je travail n'étant pas encor relié au réesau, j'ai voulu dans un premier temps tester la condition
 

Code :
  1. #!/bin/ksh 
  2.    
  3. alert=30
  4. date=`awk '{ printf("%s %s %s",$3, $2, $6) }' lastdate.txt` 
  5. temp=`awk '{ print $2 }' lasttemp.txt`
  6. if [ $temp > $alert ]
  7.    then
  8.    echo "attention !"
  9. fi


Le problème, c'est qu'il m'affiche "bad" même si la température n'a pas dépassé 30°.
 
EDIT : je suis en SHELL, /bin/sh. Comment fait-on pour transformer un type ?


Message édité par calimero_06 le 24-05-2005 à 15:00:33
Reply

Marsh Posté le 24-05-2005 à 15:00:19    

Et si tu lisais les réponses ?

Reply

Marsh Posté le 24-05-2005 à 15:14:21    

Et si tu lisais les réponses ?
 
Avec -gt ça m'affiche l'erreur suivante
 
-/releveTemp.sh: line6: [: 29.50: integer expression expected

Reply

Marsh Posté le 24-05-2005 à 15:19:50    

Affiche le contenu de "$temp" avec un echo, pour voir.

Reply

Marsh Posté le 24-05-2005 à 15:28:32    

Même erreur

Reply

Marsh Posté le 24-05-2005 à 15:54:28    

Euh, ok, mais ce que je voulais savoir c'est s'il y avait bien ta température dans $temp.
 
Parce que j'ai des doutes : ce test fonctionne parfaitement bien.
Ou alors, éventuellement, c'est ta variable LC_NUMERIC qu'est pas bonne ? Mais je n'y crois pas trop.

Reply

Marsh Posté le 25-05-2005 à 08:07:12    

Code :
  1. #!/bin/sh   
  2.      
  3. alert=30 
  4. date=`awk '{ printf("%s %s %s",$3, $2, $6) }' lastdate.txt`   
  5. temp=`awk '{ print $2 }' lasttemp.txt` 
  6. if [ $temp > $alert ] 
  7.    then
  8.    echo $temp
  9. fi


 
Que je mette supérieur ou inferieur a $alert, ca m'affichera quand même la température. -gt c'est la même chose, je vois pas ou ca poserais un problème nan ?
 
 

Code :
  1. #!/bin/sh   
  2.      
  3. alert=30 
  4. date=`awk '{ printf("%s %s %s",$3, $2, $6) }' lastdate.txt`   
  5. temp=`awk '{ print $2 }' lasttemp.txt` 
  6. if [ $temp > $alert ] 
  7.    then
  8.    echo $temp
  9.    elif [ $temp < $alert ]
  10.       then
  11.       echo " excellent "
  12. fi


 
Même avec elif ca m'affiche toujours la température  :sweat:


Message édité par calimero_06 le 25-05-2005 à 08:13:50
Reply

Marsh Posté le 25-05-2005 à 09:45:23    

Tu as contrôlé le contenu de $temp, comme je t'ai dit ?
 
Parce que je n'arrive pas à reproduire ton erreur. Chez moi, ça fonctionne.

Reply

Marsh Posté le 25-05-2005 à 09:54:08    

Tu as contrôlé le contenu de $temp
Le controler avec un echo ? Si c'est le cas, il m'affiche correctment la température  :)

Reply

Marsh Posté le 25-05-2005 à 09:59:39    

Si tu tapes :

locale -k LC_NUMERIC


Que vaut "decimal_point" ?
(mais je doute que ça vienne de là)
 
Et pour ta remarque sur la différence entre ">" et "-gt" : > compare des alphanumériques,  alors que -gt compare des numériques.
Dans le premier cas, les chaînes de caractères sont comparées lettre par lettre, par leur valeur. Dans le second, la chaîne est d'abord convertie en nombre, et traitée tel quelle.
Ce qui signifie par exemple que [ "01" = "1" ] retourne faux, alors que [ "01" -eq "1" ] retourne vrai, par exemple.


Message édité par Elmoricq le 25-05-2005 à 10:01:47
Reply

Marsh Posté le 25-05-2005 à 10:12:04    

[quotemsg=1096001,21,14993]
Si tu tapes :

locale -k LC_NUMERIC


Que vaut "decimal_point" ?
(mais je doute que ça vienne de là)
quotemsg]
 
Decimal point =","
 
Ca vient peut etre de la étant donné que ma température s'affiche avec un point :  24.12 au lieu de 24,12   Est-ce ca ?


Message édité par calimero_06 le 25-05-2005 à 10:13:19
Reply

Marsh Posté le 25-05-2005 à 10:20:01    

Peut-être.
Chez moi, test s'en moque, mais à tout hasard essaie de remplacer la ligne :
 

Code :
  1. temp=`awk '{ print $2 }' lasttemp.txt`


 
par
 

Code :
  1. temp=`awk '{ print $2 }' lasttemp.txt | sed 's/\./,/'`


 
 
Et teste ensuite en utilisant -gt


Message édité par Elmoricq le 25-05-2005 à 10:20:51
Reply

Marsh Posté le 25-05-2005 à 10:31:03    

En remplacant le . par la ,  ca fonctionne : 24.12 remplace par 24,12   Mais ca affichera quand meme la température, que ce soit < ou >  . Avec -gt, toujours la même erreur
 

Code :
  1. ./releveTemp.sh: line6: [: 24,12: integer expression expected


 :cry:  

Reply

Marsh Posté le 25-05-2005 à 10:34:34    

./releveTemp.sh: line6: [: 24,12: integer expression expected


 
Je ne parviens pas à reproduire cette erreur.
 
Hypothèse : ta version de test n'aime pas les virgules ?
Essaie avec :
 

temp=`awk '{ print $2 }' lasttemp.txt | cut -d'.' -f1`


Message édité par Elmoricq le 25-05-2005 à 10:36:00
Reply

Marsh Posté le 25-05-2005 à 10:43:49    

EDIT : ca marche avec le cut !  :bounce:  :bounce:  :bounce:
EDIT 2 : si je met pas d'espace entre # et ! ca ne fonctionne pas  
 
Je test la fontion else


Message édité par calimero_06 le 25-05-2005 à 10:47:48
Reply

Marsh Posté le 25-05-2005 à 10:45:41    

Euh, ton espace entre le '#' et le '!' du shebang, c'est une erreur de recopie ou c'est réellement comme ça dans ton script ?
 
Autrement, aucune erreur chez moi.

Reply

Marsh Posté le 25-05-2005 à 10:52:13    

C'est bon, tout fonctionne ! Vraiment merci beaucoup de ton aide !  :D


Message édité par calimero_06 le 25-05-2005 à 11:05:13
Reply

Marsh Posté le 25-05-2005 à 11:42:29    

Citation :

EDIT 2 : si je met pas d'espace entre # et ! ca ne fonctionne pas


 
 :non:  
Ca signifie soit que "sh" n'est pas dans /bin, auquel cas il faut changer le chemin, soit qu'il y a quelque chose dans ton script qui ne passe pas en Bourne shell, mais qui passe dans ton shell courant (probablement ksh).
 
Mais avec un espace, ce n'est plus un shebang mais un commentaire normal. Ce qui signifie qu'une personne qui tournera, par exemple, en csh, et qui exécutera le script, ne pourra pas le faire fonctionner.

Reply

Marsh Posté le 25-05-2005 à 11:50:06    

Je viens de vérifier, sh est biens dans /bin
Y a t'il un moyen pour corriger ce problème qui n'en est pas un pour le moment ?
 
J'ai continué mon script pour l'envoi de mail, j'ai repris ton script
 

Code :
  1. #!/bin/sh 
  2.    
  3. alert=30
  4. date=`awk '{ printf("%s %s %s",$3, $2, $6) }' lastdate.txt` 
  5. temp=`awk '{ print $2 }' lasttemp.txt | cut -d'.' -f1`
  6. if [ $temp -gt $alert ]
  7. then
  8.    mail -s '[ALERTE] Seuil de température dépassé' mail@fournisseur.com" <<EOMAIL
  9.       Seuil d'alerte dépassé.
  10.       Date du relevé : $date
  11.       Température : ${temp}°C
  12. EOMAIL
  13. fi


 
Il manque un "  , apres l'email il y en a un, il faut le placer ou le premier "  ?


Message édité par calimero_06 le 25-05-2005 à 11:51:03
Reply

Marsh Posté le 25-05-2005 à 11:52:30    

Pour le ", c'est une erreur de ma part, tu peux l'enlever carrément.
 
 
Pour le problème du shebang, il faudrait que tu nous dises quelle erreur tu as lorsque tu l'inclus.

Reply

Marsh Posté le 25-05-2005 à 11:58:28    

Aucun problème a l'execution, c'est juste que tu as dit que ca risquerait de poser un problème plus tard, c'est pour ça. LA ca marche tres bien. J'ai plus qu'a relié la machine au réseau pour verifier l'envoi de mail. Encore merci !

Reply

Marsh Posté le 25-05-2005 à 12:03:38    

Je parlais de :

Citation :

EDIT 2 : si je met pas d'espace entre # et ! ca ne fonctionne pas


 
Il est très, très fortement conseillé d'avoir un shebang pour le script.
A moins que tu ne l'invoques que par "sh tonscript.sh".
 
Maintenant si tu n'en veux pas, c'est toi qui voit.

Reply

Marsh Posté le 25-05-2005 à 12:44:40    

Mon script releveTemp.sh ke l'execute avec ./releveTemp.sh

Reply

Marsh Posté le 25-05-2005 à 13:28:05    

Ce qui signifie qu'il est interprété par le shell courant.
Si ce shell courant n'est pas sh (ou, à la limite, ksh), il risque d'y avoir des surprises.

Reply

Marsh Posté le 25-05-2005 à 17:48:49    

Non justement, il est interprete par le programme donne dans le shebang. C'est avec ". ./releveTemp.sh" qu'il serait interprete par le shell courant.

Reply

Marsh Posté le 25-05-2005 à 17:52:27    

matafan a écrit :

Non justement, il est interprete par le programme donne dans le shebang. C'est avec ". ./releveTemp.sh" qu'il serait interprete par le shell courant.


 
Oui, mais il n'y a pas de shebang justement !
J'insiste depuis trois message pour qu'il en mette un. ;)

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed