expression reguliere, awk et variable

expression reguliere, awk et variable - Codes et scripts - Linux et OS Alternatifs

Marsh Posté le 31-07-2007 à 17:08:49    

Bonjour,
 
voila, la je bloque :(
Je cherche a introduire comme variable une expression reguliere, j'y arrive pas :( :(
 
mon exemple:
un fichier contient ceci:
D|SPO2||||||20070720142116504|0|2|2|0||
D|SPO2||||||20070720152119841|0|2|2|0||
 
En fonction de ce que je lui rentre en parametre je souhaiterais qu'il m'affiche la bonne ligne, je m'explique.
mon script me demandera quelle heure je veux verifier, je lui repond 14, lui m'affiche
20070720142116504
si j'avais rentré 15 il m'aurait affiché:
20070720152119841
 
mon séparateur de champ est bien evidemment le pipe |
donc cela donne:
 
echo "Sur quelle horaire voulez vous recherchez? (exempl: 08 pour 8h)"
read HEURE
 
cat fichier|awk '{FS="|"; if($8 comment lui indiquer la variable d'expression réguliere ici??) {print $0}}
 
j'ai essayé pleins de truc, aucun ne fonctionne :( :(
 
Merci a vous

Reply

Marsh Posté le 31-07-2007 à 17:08:49   

Reply

Marsh Posté le 31-07-2007 à 18:29:40    

awk -F'\|\|\|\|\|\|' '{print $2}' fichier          me donne ça...
20070720142116504|0|2|2|0||

Reply

Marsh Posté le 31-07-2007 à 19:33:24    

oui mais ce n'est pas cela que je veux ;) je veux qu'il regarde si l'heure est la bonne en fonction de ma variable rentré en parametre.
J'ai trouvé une parti de la solution en faisant un grep plutot qu'un awk mais j'aimerais quand meme savoir comment lui rentré en expression reguliere une variable ;)

Reply

Marsh Posté le 31-07-2007 à 20:32:14    

exover a écrit :

oui mais ce n'est pas cela que je veux ;) je veux qu'il regarde si l'heure est la bonne en fonction de ma variable rentré en parametre.
J'ai trouvé une parti de la solution en faisant un grep plutot qu'un awk mais j'aimerais quand meme savoir comment lui rentré en expression reguliere une variable ;)


 
 
http://www.shelldorado.com/goodcoding/awkinvoke.html
cf http://forum.hardware.fr/hfr/OSAlt [...] 3546_1.htm
 
:o


---------------
Il y a autant d'atomes d'oxygène dans une molécule d'eau que d'étoiles dans le système solaire.
Reply

Marsh Posté le 31-07-2007 à 22:50:37    


Fonctionne en shell bash  ;)  
 

Code :
  1. read -p "Sur quelle horaire voulez vous recherchez? (exemple: 8 pour 8h) : " -n 2 heure
  2. while true
  3. do
  4. if [[ $heure == [0-9]* && ${#heure} -lt 3 && $heure -lt 24 ]] ; then
  5.  break
  6. else
  7.  echo ""
  8.  read -p "*** format incorrect, retapez (abandon <Ctl-c> ) : " -n 2 heure
  9. fi
  10. done
  11. echo ""
  12. if [[ ${#heure} == 1 ]] ; then
  13. heure="0${heure}"
  14. fi
  15. awk -F"|" -v heure=$heure '
  16. {
  17. if (heure == substr($8,9,2)) {
  18.  total++
  19.  print $0
  20. }
  21. }
  22. END {
  23. if (total == 0) print "* Rien à "heure"h !"
  24. } ' fichier.log


Reply

Marsh Posté le 31-07-2007 à 23:11:28    

blaireau> sympa ton script mais désolé moi j'ai rien compris lol
mis a part au début ou tu verifie qu'on tappe pas plus de 24, -n é heure je suppose que c'est pour verifié qu'on ne tappe pas plus de 2 chiffres non?
 
Mais alors le:  
heure == substr($8,9,2)) {        total++        print $0
 
rien capté a cela lol ca fais  substr?? et pourquoi $8,9 et 2??
 
Xavier_OM> je vais regarder, merci ;)
edit: Arfff totu en anglais :(


Message édité par exover le 31-07-2007 à 23:14:19
Reply

Marsh Posté le 01-08-2007 à 20:03:57    

rien capté a cela lol ca fais  substr?? et pourquoi $8,9 et 2??
 
Je te renvoie à ton message d'origine dans lequel tu fais mention de $8 et, sauf erreur de ma part, l'heure est en position 9 sur 2 chiffres dans ce champ ($8)  :sarcastic:  
substr($8,9,2) --> Extrait la "sous-chaîne" en position 9 sur une longeur de 2 du champ $8.
Même sans comprendre, as-tu essayé de lancer le script  :p  
 
En fonction de ce que je lui rentre en parametre je souhaiterais qu'il m'affiche la bonne ligne, je m'explique.  
mon script me demandera quelle heure je veux verifier, je lui repond 14, lui m'affiche  
20070720142116504  
si j'avais rentré 15 il m'aurait affiché:  
20070720152119841

 
http://lea-linux.org/cached/index/Dev-awk.html


Message édité par blaireau one le 01-08-2007 à 20:05:54
Reply

Marsh Posté le 01-08-2007 à 21:46:23    

oui j'ai essayé, il n'a pas fonctionné ;) j'ai pas eut le temps de m'y pencher plus serieusement ;)
 
Merci pour l'explication du substr.

Reply

Marsh Posté le 01-08-2007 à 22:09:07    


Important : ce script tourne en shell bash mais pas en ksh (il me semble)  :whistle:

Reply

Marsh Posté le 01-08-2007 à 22:58:01    

Question conne :D
comment  je lui fais comprendre que c'est du shell bash??

Reply

Marsh Posté le 01-08-2007 à 22:58:01   

Reply

Marsh Posté le 01-08-2007 à 23:14:20    

Déjà, pour savoir sous quel shell tu es, tu tapes la commande ps qui te donne un truc du genre :
 
      PID    PPID    PGID     WINPID  TTY  UID    STIME COMMAND
 .../...
     3800    3652    3800       4532    0 1007 21:47:23 /usr/bin/bash
      916    3800     916       4052    0 1007 23:11:26 /usr/bin/ps
 
Si tu es en ksh, je pense qu'il suffit remplacer l'insctruction :
read -p "Sur quelle horaire voulez vous recherchez? (exemple: 8 pour 8h) : " -n 2 heure
par
echo "Sur quelle horaire voulez vous recherchez? (exemple: 8 pour 8h) : "
read heure


Message édité par blaireau one le 01-08-2007 à 23:15:15
Reply

Marsh Posté le 01-08-2007 à 23:54:41    

ah c'est tout :D :D
J'essayerais cela demain ;)
 
merci a toi en tout cas ;)
 
 
enfin merci a vous.

Reply

Marsh Posté le 02-08-2007 à 11:17:15    

Bon je suis en ksh ;)
 
J'ai modifié les lignes pour que le ksh comprennent, j'ai lancé le scripts, il me dit:
 
awk : 0602-566 Impossible de diviser par zéro.
 Numéro de ligne en entrée : 1.
 Numéro de ligne source : 10.
 
pourrais tu m'expliquer cela stp :
if [[ ${#heure} == 1 ]] ; then
    heure="0${heure}"
 
je sais je sais je suis null :D
je vais evidemment regarder sur léalinux egalement ;)

Reply

Marsh Posté le 02-08-2007 à 21:03:21    


${#heure} --> le résultat correspond à la longueur de la variable $heure.
Si les valeurs 1, 2... ou 9 ont été saisies, le script insère un 0 devant, exemple :
8  --> 08
 
if [[ ${#heure} == 1 ]] ; then    
    heure="0${heure}"
fi

 
Afin de cerner le problème, ajout un echo de $heure après le "if" ci-dessus :
 
echo "* heure = $heure"
 
 
 

Reply

Marsh Posté le 02-08-2007 à 21:28:30    

Merci pour tes explications, je verrais cela demain au boulot, en tout cas tu m'apprends pas mal de chose.

Reply

Marsh Posté le 03-08-2007 à 10:48:00    

quand je met le echo il me repond bien la bonne heure, j'ai toujours le meme message par contre, division par zéro.
je suis en train de regarder mais je ne vois pas ou est l'erreur par rapport aux explication que tu m'as fourni :(

Reply

Marsh Posté le 03-08-2007 à 11:05:54    

si la reponse prend plus d'une page, comme faire pour inserer un more??? enfin si c'est possible :D
peux t'on retravailler sur le resultat affiché? du genre au lieu de m'afficher:
20070720142116504
il m'afficherait:  
2007-07-20 14:21 ou merme simplement 14:21 (la date etant toujours celle du jour), et meme rajouterais une derniere ligne du genre
--------------
total : xxx
 
j'en demande beaucoup la lol.

Reply

Marsh Posté le 03-08-2007 à 11:32:53    

il a pas l'air d'aimer le total++, j'ai virer la fin du script, toujours une erreur, j'ai virere le total++ et la ca print bien ;)
plus qu'a trouver comment faire le total :D :D

Reply

Marsh Posté le 05-08-2007 à 20:02:16    

exover a écrit :

il a pas l'air d'aimer le total++, j'ai virer la fin du script, toujours une erreur, j'ai virere le total++ et la ca print bien ;)
plus qu'a trouver comment faire le total :D :D


 
Quelque-soit le awk, la commande total++ devrait fonctionner   :??: .  
La version di-dessous :
. total++ remplacé par total=total+1
. affiche date et heure formatées
. affichage écran/écran ( more resultat.log )
 

Code :
  1. awk -v heure=$heure '
  2. BEGIN {
  3. FS="|"
  4. OFS="|"
  5. }
  6. {
  7. if (heure == substr($8,9,2)) {
  8.  total=total+1
  9.  $8=substr($8,7,2)"/"substr($8,5,2)"/"substr($8,1,4)" - "substr($8,9,2)":"substr($8,11,2)"  "substr($8,13)
  10.  print $0
  11. }
  12. }
  13. END {
  14. if (total == 0) print "* Rien à "heure"h !"
  15. } ' test > resultat.log
  16. more resultat.log


 
Résultat :  
D|SPO2||||||20/07/2007 - 15:21  19841|0|2|2|0||

Reply

Marsh Posté le 06-08-2007 à 14:58:16    

la tout fonctionne :D :D
 
Merci msieur
 


Message édité par exover le 06-08-2007 à 15:04:18
Reply

Marsh Posté le 06-08-2007 à 15:03:48    

BEGIN c'est ce qui se passe avant le traitement à proprement parler
END c'est ce qui se passe après le traitement
 
OFS c'est pour Output Field Separator
 
:)


---------------
Wedge#2487 @HS -#- PW: +∞ -#- Khaz-Modan/Boltiz @WoW
Reply

Marsh Posté le 06-08-2007 à 23:07:36    

Begin et end je connaisssait, je ne connaissais pas OFS par contre, j'ai essayé et j'ai su a quoi cela servait.
Je pensais par contre qu'on pouvait integrer un more directement, pas grave :D
J'aurais appris qq bonne choses dans ce scripts ;)

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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