expression reguliere, awk et variable - Codes et scripts - Linux et OS Alternatifs
Marsh Posté le 31-07-2007 à 18:29:40
awk -F'\|\|\|\|\|\|' '{print $2}' fichier me donne ça...
20070720142116504|0|2|2|0||
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
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. |
http://www.shelldorado.com/goodcoding/awkinvoke.html
cf http://forum.hardware.fr/hfr/OSAlt [...] 3546_1.htm
Marsh Posté le 31-07-2007 à 22:50:37
Fonctionne en shell bash
Code :
|
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
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)
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
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
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.
Marsh Posté le 01-08-2007 à 22:09:07
Important : ce script tourne en shell bash mais pas en ksh (il me semble)
Marsh Posté le 01-08-2007 à 22:58:01
Question conne
comment je lui fais comprendre que c'est du shell bash??
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
Marsh Posté le 01-08-2007 à 23:54:41
ah c'est tout
J'essayerais cela demain
merci a toi en tout cas
enfin merci a vous.
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
je vais evidemment regarder sur léalinux egalement
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"
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.
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
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
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.
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
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 |
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 :
|
Résultat :
D|SPO2||||||20/07/2007 - 15:21 19841|0|2|2|0||
Marsh Posté le 06-08-2007 à 14:58:16
la tout fonctionne
Merci msieur
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
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
J'aurais appris qq bonne choses dans ce scripts
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