Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
660 connectés 

  FORUM HardWare.fr
  Programmation
  Shell/Batch

  Script Shell

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Script Shell

n°1093448
calimero_0​6
M'en Bati Sieù Nissart
Posté le 23-05-2005 à 14:58:07  profilanswer
 

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.

mood
Publicité
Posté le 23-05-2005 à 14:58:07  profilanswer
 

n°1093460
Elmoricq
Modérateur
Posté le 23-05-2005 à 15:02:21  profilanswer
 

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".

n°1093491
calimero_0​6
M'en Bati Sieù Nissart
Posté le 23-05-2005 à 15:16:02  profilanswer
 

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

n°1093535
Elmoricq
Modérateur
Posté le 23-05-2005 à 15:38:23  profilanswer
 

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
n°1094539
calimero_0​6
M'en Bati Sieù Nissart
Posté le 24-05-2005 à 10:35:31  profilanswer
 

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

n°1094595
Elmoricq
Modérateur
Posté le 24-05-2005 à 11:04:42  profilanswer
 

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 ?

n°1094649
calimero_0​6
M'en Bati Sieù Nissart
Posté le 24-05-2005 à 11:31:11  profilanswer
 

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

n°1094727
Elmoricq
Modérateur
Posté le 24-05-2005 à 12:07:01  profilanswer
 

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)

n°1094843
calimero_0​6
M'en Bati Sieù Nissart
Posté le 24-05-2005 à 13:21:48  profilanswer
 

Nikel, ca marche !  :bounce:


Message édité par calimero_06 le 24-05-2005 à 13:46:37
n°1094910
calimero_0​6
M'en Bati Sieù Nissart
Posté le 24-05-2005 à 13:55:33  profilanswer
 

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
mood
Publicité
Posté le 24-05-2005 à 13:55:33  profilanswer
 

n°1095002
Elmoricq
Modérateur
Posté le 24-05-2005 à 14:39:43  profilanswer
 

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
n°1095053
calimero_0​6
M'en Bati Sieù Nissart
Posté le 24-05-2005 à 14:57:45  profilanswer
 

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
n°1095060
Elmoricq
Modérateur
Posté le 24-05-2005 à 15:00:19  profilanswer
 

Et si tu lisais les réponses ?

n°1095089
calimero_0​6
M'en Bati Sieù Nissart
Posté le 24-05-2005 à 15:14:21  profilanswer
 

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

n°1095101
Elmoricq
Modérateur
Posté le 24-05-2005 à 15:19:50  profilanswer
 

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

n°1095116
calimero_0​6
M'en Bati Sieù Nissart
Posté le 24-05-2005 à 15:28:32  profilanswer
 

Même erreur

n°1095160
Elmoricq
Modérateur
Posté le 24-05-2005 à 15:54:28  profilanswer
 

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.

n°1095833
calimero_0​6
M'en Bati Sieù Nissart
Posté le 25-05-2005 à 08:07:12  profilanswer
 

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
n°1095978
Elmoricq
Modérateur
Posté le 25-05-2005 à 09:45:23  profilanswer
 

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.

n°1095991
calimero_0​6
M'en Bati Sieù Nissart
Posté le 25-05-2005 à 09:54:08  profilanswer
 

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  :)

n°1096001
Elmoricq
Modérateur
Posté le 25-05-2005 à 09:59:39  profilanswer
 

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
n°1096029
calimero_0​6
M'en Bati Sieù Nissart
Posté le 25-05-2005 à 10:12:04  profilanswer
 

[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
n°1096047
Elmoricq
Modérateur
Posté le 25-05-2005 à 10:20:01  profilanswer
 

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
n°1096070
calimero_0​6
M'en Bati Sieù Nissart
Posté le 25-05-2005 à 10:31:03  profilanswer
 

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:  

n°1096076
Elmoricq
Modérateur
Posté le 25-05-2005 à 10:34:34  profilanswer
 

./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
n°1096096
calimero_0​6
M'en Bati Sieù Nissart
Posté le 25-05-2005 à 10:43:49  profilanswer
 

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
n°1096102
Elmoricq
Modérateur
Posté le 25-05-2005 à 10:45:41  profilanswer
 

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.

n°1096122
calimero_0​6
M'en Bati Sieù Nissart
Posté le 25-05-2005 à 10:52:13  profilanswer
 

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


Message édité par calimero_06 le 25-05-2005 à 11:05:13
n°1096307
Elmoricq
Modérateur
Posté le 25-05-2005 à 11:42:29  profilanswer
 

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.

n°1096327
calimero_0​6
M'en Bati Sieù Nissart
Posté le 25-05-2005 à 11:50:06  profilanswer
 

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
n°1096337
Elmoricq
Modérateur
Posté le 25-05-2005 à 11:52:30  profilanswer
 

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.

n°1096366
calimero_0​6
M'en Bati Sieù Nissart
Posté le 25-05-2005 à 11:58:28  profilanswer
 

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 !

n°1096384
Elmoricq
Modérateur
Posté le 25-05-2005 à 12:03:38  profilanswer
 

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.

n°1096445
calimero_0​6
M'en Bati Sieù Nissart
Posté le 25-05-2005 à 12:44:40  profilanswer
 

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

n°1096497
Elmoricq
Modérateur
Posté le 25-05-2005 à 13:28:05  profilanswer
 

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.

n°1097053
matafan
Posté le 25-05-2005 à 17:48:49  profilanswer
 

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.

n°1097058
Elmoricq
Modérateur
Posté le 25-05-2005 à 17:52:27  profilanswer
 

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. ;)

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Shell/Batch

  Script Shell

 

Sujets relatifs
Script shellShell script : redirection synchrone vers un fichier ?
Script Shell (simple?) sftpshell script qui lit dans un fichier
lancer un script shell sur un serveur distant a partir d'un batch[SHELL] script en shell (clos)
Executer un script shell sur un serveur unix distant a partir de winNTscript shell pour concatener un ensemble de fichier.
Shell tcsh, script pour tests... Pour les pros de tcshScript shell / e-mail
Plus de sujets relatifs à : Script Shell


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR