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

  FORUM HardWare.fr
  Linux et OS Alternatifs
  Codes et scripts

  expression reguliere, awk et variable

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

expression reguliere, awk et variable

n°939140
exover
Posté le 31-07-2007 à 17:08:49  profilanswer
 

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

mood
Publicité
Posté le 31-07-2007 à 17:08:49  profilanswer
 

n°939176
sputnick
bip...bip...bip...bip...bi...b
Posté le 31-07-2007 à 18:29:40  profilanswer
 

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

n°939185
exover
Posté le 31-07-2007 à 19:33:24  profilanswer
 

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

n°939198
Xavier_OM
Monarchiste régicide (fr quoi)
Posté le 31-07-2007 à 20:32:14  profilanswer
 

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.
n°939230
blaireau o​ne
Posté le 31-07-2007 à 22:50:37  profilanswer
 


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


n°939237
exover
Posté le 31-07-2007 à 23:11:28  profilanswer
 

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
n°939548
blaireau o​ne
Posté le 01-08-2007 à 20:03:57  profilanswer
 

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
n°939560
exover
Posté le 01-08-2007 à 21:46:23  profilanswer
 

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.

n°939568
blaireau o​ne
Posté le 01-08-2007 à 22:09:07  profilanswer
 


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

n°939584
exover
Posté le 01-08-2007 à 22:58:01  profilanswer
 

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

mood
Publicité
Posté le 01-08-2007 à 22:58:01  profilanswer
 

n°939587
blaireau o​ne
Posté le 01-08-2007 à 23:14:20  profilanswer
 

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
n°939595
exover
Posté le 01-08-2007 à 23:54:41  profilanswer
 

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

n°939714
exover
Posté le 02-08-2007 à 11:17:15  profilanswer
 

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

n°940003
blaireau o​ne
Posté le 02-08-2007 à 21:03:21  profilanswer
 


${#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"
 
 
 

n°940018
exover
Posté le 02-08-2007 à 21:28:30  profilanswer
 

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

n°940137
exover
Posté le 03-08-2007 à 10:48:00  profilanswer
 

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

n°940143
exover
Posté le 03-08-2007 à 11:05:54  profilanswer
 

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.

n°940150
exover
Posté le 03-08-2007 à 11:32:53  profilanswer
 

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

n°940626
blaireau o​ne
Posté le 05-08-2007 à 20:02:16  profilanswer
 

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

n°940779
exover
Posté le 06-08-2007 à 14:58:16  profilanswer
 

la tout fonctionne :D :D
 
Merci msieur
 


Message édité par exover le 06-08-2007 à 15:04:18
n°940783
wedgeant
Da penguin inside
Posté le 06-08-2007 à 15:03:48  profilanswer
 

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
n°940895
exover
Posté le 06-08-2007 à 23:07:36  profilanswer
 

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

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Linux et OS Alternatifs
  Codes et scripts

  expression reguliere, awk et variable

 

Sujets relatifs
gvim Expression réguliére Eof[snmp/cacti] type de variable renvoyé par une oid
script zsh avec utilisation de awk, passage de variable[Systeme liste diffusion SYMPA] Expression régulière + form
[Noob] Ajouter avec un script une variable d'envsquid guard interdire des expression mais pas sur certain sites
remplacement variable script bashBash] Boucle while - export variable
Plus de sujets relatifs à : expression reguliere, awk et variable


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