Rechercher : dans
Par :

Shell expressions régulières again

Dernière réponse le 5 déc 2008 à 07:40:39 lookouster, le 23 aoû 2007 à 17:08:59 
 Signaler ce message aux modérateurs

Slt à tous.
Une fois encore j'ai des problèmes avec les expressions régulières.
Je reçois ds mon programme shell deux paramètres dates du genre 0601 et 0630 (du 01 juin au 30juin).
Je fais un sed sur un fichier histoire de trver les lignes ki contiennent des dates comprises entre ces deux dates.
Mon fichier est de la forme:
http://cjoint.com/data/iqopJC7GXy.htm
j'ai essayé un truc de la forme sed -e "/^blablabla[$2-$3]/!d fich

j'ai un message d'erreur du genre "sed invalide range end"
Lookouster.partager.cècool!!

Configuration: Windows XP
Internet Explorer 6.0

Meilleures réponses pour « Shell expressions régulières again » dans :
PHP - Expressions régulières Voir Qu'est-ce qu'une expression régulière? Les expressions régulières sont des modèles créés à l'aide de caractères ASCII permettant de manipuler des chaînes de caractères, c'est-à-dire permettant de trouver les portions de la chaîne correspondant au...
[RegExp] Récupérer une adresse IP VoirFinalité Mise en œuvre Explications Interprétation du motif Récupérer une adresse IP Finalité Pour récupérer une IP dans un fichier texte, fichiers journaux, pages web, etc. Mise en œuvre L'expression régulière suivante combinée à la...
[PHP] Transformer une URL en lien hypertexte cliquable VoirGrâce aux expressions régulières, il est possible de transformer en lien hypertexte toute URL de la forme http://URL (ou ftp://URL) ou bien commençant par www. :
Google - Recherche d'une expression exacte VoirLorsque l’on souhaite faire la recherche d’une expression exacte, il suffit de mettre cette expression entre guillemets. Exemple : "animal domestique" référencera uniquement les sites comportant l’expression "animal domestique".
Javascript - L'objet RegExp VoirLes particularités de l'objet RegExp L'objet RegExp est un objet permettant de manipuler des expressions régulières, c'est-à-dire des modèles créés à l'aide de caractères ASCII permettant de manipuler des chaînes de caractères, afin de trouver des...

1

lami20j, le 23 aoû 2007 à 20:21:05

Salut,

tu n'as pas compris les classes de caractères je vois
pour avoir une date comprise entre 01 et 30 juin tu peux écrire quelque chose de genre

lami20j@deb:~$ cat Desktop/boutfich.htm
3226220205011533372001      97983928        00008020000028000003       0
3227220206011533373001      95572928        00000020400000000000       0
322802020601153337601       21383551        00011010000042000001       0
32290102061015333821313480  20223249        00003020001031000032       0
3230220206111533372001      97387721        00008020000013000002       0
3231220206211533374010      90010174        00008020000043000005       0
3232220206291533374010      90933877        00008020000006000001       0
3233220206301533372001      97237383        00000020400000000000       0
323402020630153338701       80100000        00021010002826000010       0
3235220207011533382001      97136268        00000020400000000000       0
3236220207011533383001      90038265        00000020400000000000       0
lami20j@deb:~$ cat Desktop/boutfich.htm | sed '/06\([0-2][0-9]\|30\)/!d'
3227220206011533373001      95572928        00000020400000000000       0
322802020601153337601       21383551        00011010000042000001       0
32290102061015333821313480  20223249        00003020001031000032       0
3230220206111533372001      97387721        00008020000013000002       0
3231220206211533374010      90010174        00008020000043000005       0
3232220206291533374010      90933877        00008020000006000001       0
3233220206301533372001      97237383        00000020400000000000       0
323402020630153338701       80100000        00021010002826000010       0
lami20j@deb:~$ cat Desktop/boutfich.htm | sed '/06\([0-2][0-9]\|30\)/d'
3226220205011533372001      97983928        00008020000028000003       0
3235220207011533382001      97136268        00000020400000000000       0
3236220207011533383001      90038265        00000020400000000000       0
lami20j@deb:~$
--
lami20j

Répondre à lami20j

2

lookouster, le 24 aoû 2007 à 11:06:58

T'as pas compris ma question au fait!!
Ds mon cas, c'est ke la date est passée par variable!! dc ds l'intervalle à faire fugurer dans l'expression régulière il faut laisser aparaitre une variable.
Merci Lookouster.partager.cècool!!

Répondre à lookouster

3

jipicy, le 24 aoû 2007 à 11:14:23

Si il a compris la question !

C'est à toi d'adapter tes variables en fonction de la syntaxe que t'a donnée lami20j !
Z'@+...che.

JP : Zen, my Nuggets ! ;-)
Le savoir n'est bon que s'il est partagé.

Répondre à jipicy

4

lookouster, le 24 aoû 2007 à 11:32:00

Mon problème est de savoir comment extraire les lignes ou les dates sont comprises entre
13 janvier et 28 spetmebre par exemple.
les jours et mois peuvent varier!!!
et c ke j'aimerais savoir si ya pas un truc du genre
sed "/[$mois1-$mois2][$jour1-$jour2]/.... Lookouster.partager.cècool!!

Répondre à lookouster

5

lami20j, le 24 aoû 2007 à 12:37:16

Salut,

comme je l'ai déjà dit, tu n'as pas compris les classes de caractères

entre les crochetschaque caractère est lu tel quel sauf certaines exceptions
par exemple le point à l'intérieur d'une classe de caractères est lu comme un caractère litérral donc il n'est plus un métacaractère de la regex
Une classe de caractère c'est un mini environnement où les variables ne peuvent pas être exploitées

en revanche on peut bidouiller pour utiliser des variables mais pas de la manière que tu veux
je n'ai pas le temps pour l'instant, mais si jamais tu ne trouves pas la réponse jusqu'à ce soir
je vais essayer de te donner une solution :-)
lami20j

Répondre à lami20j

6

_vince, le 24 aoû 2007 à 14:48:05

Hello,

Je n'ai pas trouve la solution en shell/sed mais je l'ai trouve en awk.
Le format du fichier texte est fortement ameliorable... Pourquoi ne pas reserver une colonne pour la date?
Que se passe-t-il lorsque l'on change d'annee?

#!/bin/awk
# Filename: test.awk
# Usage: awk -f test.awk -v start=MMDD stop=MMDD boutfichier.txt
$1 ~ /[0-9]*/ {
# D'apres le format du fichier
# je suppose que la date commence toujours au neuvieme caractere.
date = substr($0, 9, 4);
if (date >= start && date <= stop) {
print $0;
}
}

Répondre à _vince

25

carpathia, le 4 déc 2008 à 04:26:53

Bonsoir

je cherche de laide sur awk comment avoir en méme temp dans la méme command un cpu status et last restart server
cpu statuts :/usr/sbin/psrinfo
als101
--------
0 on-line since 03/22/2007 01:50:34
1 on-line since 03/22/2007 01:50:34
2 on-line since 03/22/2007 01:50:34
3 on-line since 03/22/2007 01:50:34

et last restart server : uptime | awk '{print "============>>"$3" " " "$4}'

als101
--------
============>>622 days,

je veut les combiné

Répondre à carpathia

26

jipicy, le 4 déc 2008 à 07:38:16

Salut,

Essaye ça :

((/usr/sbin/psrinfo | head -1)  && uptime) | sed 'N;s/\n/ /' | awk...
Je te laisse adapter la syntaxe de "awk" en fonction de la nouvelle sortie ;-))
$ man woman
Il n'y a pas de page de manuel pour woman.

Répondre à jipicy

27

carpathia, le 4 déc 2008 à 23:14:06

Bonsoir

jai le resultat :

als101
--------
============>>-line since
============>>623 days,

avec cette command :

((/usr/sbin/psrinfo | head -1) && uptime) | sed 'N;s/\n/ /'|awk '{print "============>>"$3" " " "$4}'

Répondre à carpathia

28

 jipicy, le 5 déc 2008 à 07:40:39

Bon alors procédons par ordre...

Affiche le résultat de chacune des commandes suivantes :

/usr/sbin/psrinfo
/usr/sbin/psrinfo | head -1
uptime
/usr/sbin/psrinfo | head -1 && uptime
(/usr/sbin/psrinfo | head -1 && uptime) | sed 'N;s/\n/ /'
Fais un copier/coller exact de la commande tapée dans un terminal et de son résultat affiché. Merci.
$ man woman
Il n'y a pas de page de manuel pour woman.

Répondre à jipicy

7

lami20j, le 24 aoû 2007 à 15:29:33

Salut,

#!/bin/bash

echo -e "Entrez mois : \c"
read mois
echo -e "Entrez jour debut : \c"
read jdeb
echo -e "Entrez jour fin : \c"
read jfin

while read ligne
do
m=${ligne:8:2}
j=${ligne:10:2}

if  [ $m -eq $m -a $j -ge $jdeb -a $j -le $jfin ]
  then
   echo $ligne
 fi
done < aaa
lami20j@debian:~$ cat aaa
322802020501153337601
322802020601153337601
322802020601153337601
322802020602153337601
322802020603153337601
322802020610153337601
322802020610153337601
322802020610153337601
322802020610153337601
322802020615153337601
322802020617153337601
322802020630153337601
322802020701153337601
lami20j@debian:~$ sh ccm.sh
Entrez mois : 06
Entrez jour debut : 9
Entrez jour fin : 22
322802020610153337601
322802020610153337601
322802020610153337601
322802020610153337601
322802020615153337601
322802020617153337601
lami20j@debian:~$
lami20j

Répondre à lami20j

8

lookouster, le 24 aoû 2007 à 16:35:57

Merci pour les efforts mais 7 ligne
Cette ligne j'y vois k dalle!!
if [ $m -eq $m -a $j -ge $jdeb -a $j -le $jfin ] Lookouster.partager.cècool!!

Configuration: Windows XP
Internet Explorer 6.0

Répondre à lookouster

9

lami20j, le 24 aoû 2007 à 16:42:34

Ce n'est qu'un exemple
tu n'as qu'as les tester sur un fichier plus grand

je ne vois pas où est le problème
tu veux obtenir les lignes entre 2 dates si j'ai bien compris

soit un peu plus cohérent dans tes messages, et pas de SMS s'il te plaît

affiche ce que tu tapes ainsi que le fichier
et on verra ce que ne marche pas lami20j

Configuration: Windows XP
Internet Explorer 6.0

Répondre à lami20j

10

lookouster, le 24 aoû 2007 à 17:50:37

Non, Xcuses pour l'écriture.
Ma préoccupation est qu'au fait je veux comprendre cette syntaxe i mean que fait-elle??
if [ $m -eq $m -a $j -ge $jdeb -a $j -le $jfin ] Lookouster.partager.cècool!!

Configuration: Windows XP
Internet Explorer 6.0

Répondre à lookouster

11

lami20j, le 24 aoû 2007 à 18:06:04

if  [ $m -eq $mois -a $j -ge $jdeb -a $j -le $jfin ]
j'ai fait une erreur (correction en gras), désolé

SI $m (m c'est le mois dans ta chaine) est égal avec $mois (ce que tu saisi) AND $j (j c'est le jour dans la chaine) est plus grand ou égal que $jdeb (ta saisie) AND le même $j est plus petit ou égal que $jfin (ta saisie)

ALORS
alors affiche la ligne

IS (END SI)
lami20j
Configuration: Windows XP
Internet Explorer 6.0

Répondre à lami20j

12

jipicy, le 24 aoû 2007 à 18:07:09

Salut,

À mon avis y'a un ch'tit bug dans la syntaxe, il faut lire plutôt :

if [ $m -eq $mois -a $j -ge $jdeb -a $j -le $jfin ]
Ce qui revient à dire :

if = si
$m = la variable $m (contenant le 8ème et 9ème caractère)
-eq = est égale
$mois = à la variable $mois (premier "read" du script)
-a = ET
$j = la variable $j (contenant le 10ème et 11ème caractère)
-ge = est plus grande que
$jdeb = la variable $jdeb (2ème "read" du script)
-a = ET
$j = la variable $j (contenant le 10ème et 11ème caractère)
-le = est plus petite que
$jfin = la variable $jfin (3ème "read" du script)

;-))
Z'@+...che.
JP : Zen, my Nuggets ! ;-)
Le savoir n'est bon que s'il est partagé.

Répondre à jipicy

13

lami20j, le 24 aoû 2007 à 18:10:43

Salut,

À mon avis
ton avis est juste :-) lami20j

Configuration: Windows XP
Internet Explorer 6.0

Répondre à lami20j

16

jipicy, le 24 aoû 2007 à 18:17:55

Je suis de ton avis alors ;-))

PS. Configuration: Windows XP C'est quoi ça ??? :-DD
Z'@+...che.

JP : Zen, my Nuggets ! ;-)
Le savoir n'est bon que s'il est partagé.

Répondre à jipicy

20

lami20j, le 24 aoû 2007 à 18:38:00

Configuration: Windows XP C'est quoi ça ??? :-DD
Je suis au boulot :-D

Toute fois, ça m'a permis de beta testeurs de ccm 2 0#43 lami20j

Configuration: Windows XP
Internet Explorer 6.0

Répondre à lami20j

14

lookouster, le 24 aoû 2007 à 18:11:33

Je ne vois pas la différence entre vos deux syntaxes lol.
C'était le -a ki me troublait. j'aurais moi mis chacune des conditions ds son crochet avec des and en séparateur.
Merci pour tout!! Lookouster.partager.cècool!!

Configuration: Windows XP
Internet Explorer 6.0

Répondre à lookouster

15

lami20j, le 24 aoû 2007 à 18:13:40

Le -a c'est pour AND

if [ test1 AND test2 AND test3 ]
--
lami20j
Configuration: Windows XP
Internet Explorer 6.0

Répondre à lami20j

17

lookouster, le 24 aoû 2007 à 18:28:26

Dites, j'ai un autre problème mais sous HP-UX. Je multiplie une variable par 17 c'est à dire
mont=$(($ntba*17))

sous linux (knoppix) pas d blems.
Mais sur HP-UX il me crée tous les problèmes du monde lol.
Vous aurez une idée d comment faire ça autrement? Lookouster.partager.cècool!!

Configuration: Windows XP
Internet Explorer 7.0

Répondre à lookouster

18

jipicy, le 24 aoû 2007 à 18:32:51

[tmpfs]$ echo $var
100

[tmpfs]$ new_var=$(echo "$var * 17" | bc)

[tmpfs]$ echo $new_var
1700

[tmpfs]$
;-))
Z'@+...che.
JP : Zen, my Nuggets ! ;-)
Le savoir n'est bon que s'il est partagé.

Répondre à jipicy

19

lookouster, le 24 aoû 2007 à 18:36:20

AH tu fais appel à beautifull calculator!!!
okay j vais essayer. C'est dur comme on peut galérer!!
Lookouster.partager.cècool!!

Configuration: Windows XP
Internet Explorer 7.0

Répondre à lookouster

21

lookouster, le 24 aoû 2007 à 18:50:51

Nop ça prend pas!!
Merci kan même Lookouster.partager.cècool!!

Configuration: Windows XP
Internet Explorer 7.0

Répondre à lookouster

23

jipicy, le 24 aoû 2007 à 18:56:56

Essaie comme ça alors :

new_var=$(expr $var \* 17)
et arrête le SEUMEUSEU merci ! Z'@+...che.
JP : Zen, my Nuggets ! ;-)
Le savoir n'est bon que s'il est partagé.

Répondre à jipicy

22

lami20j, le 24 aoû 2007 à 18:53:30

Mais sur HP-UX il me crée tous les problèmes du monde lol.
Et, si tu nous donnes un peu ce que tu as comme résultat, au moins pour voir tous les problèmes du monde :-)) lami20j

Configuration: Windows XP
Internet Explorer 6.0

Répondre à lami20j