Annonce

Bienvenue sur les forums de ToulonuX.

Vu le nombre important de parasites (spammeurs), le forum est fermé aux inscriptions via l'interface. Contactez clarky chez tuxfamily si vous voulez un compte.

#1 30-06-2009 14:34:09

obibi
Conseiller de ToulonuX
Lieu: Paris
Date d'inscription: 07-04-2008
Messages: 378

RegExp

J'ai un petit soucis, je voudrais vérifier qu'un fichier (/etc/rc.local) contient bien l'instruction exit 0, mais pas en commentaire, et je cherche à caractériser ça avec une regexp:
Je pensais à qqchose du genre:

Code:

$ grep [^#]exit\ 0 /etc/rc.local
# Make sure that the script will "exit 0" on success or any other
exit 0

mais à l'évidence ça ne marche pas: il me retourne tous les exit 0.
Je voudrais juste qu'il me sorte les occurrences de exit 0 non précédés d'un # .
Des idées ?


"Tout est Illusion." (Gautama Bouddha)
"Tout est Amour." (Jésus de Nazareth)
"Tout est Relatif." (Albert Einstein)
"Tout est Fichier." (Ken Thompson)

Hors ligne

 

#2 30-06-2009 18:40:19

maceo
Conseiller de ToulonuX
Lieu: Néoules
Date d'inscription: 09-04-2008
Messages: 540

Re: RegExp

Une idée autrement, parce que je n'ai jamais compris comment utiliser les regexp avec grep:

Code:

perl -ne "print if /^[^#]*exit 0/" /etc/rc.local

Si tu veux exit 0 seul sur sa ligne:

Code:

perl -ne "print if /^\s*exit 0\s*$/" /etc/rc.local

\s est tout caractère d'espacement, y compris tabulation

Édit: je crois que je viens de comprendre grep: cool

Code:

grep ^\s*exit\ 0\s*$ /etc/rc.local
grep '^\s*exit 0\s*$' /etc/rc.local

Merci ô Bibi !

PS: le problème dans ton expression, c'est que tu ne mets une condition que sur LE caractère qui précède immédiatement "exit 0" et pas sur TOUS.

Dernière modification par maceo (30-06-2009 19:19:06)


Le saint patron des informaticiens, c'est Saint Taxerror

Hors ligne

 

#3 02-07-2009 14:08:05

obibi
Conseiller de ToulonuX
Lieu: Paris
Date d'inscription: 07-04-2008
Messages: 378

Re: RegExp

Ok, merci maceo.

Le problème avec

Code:

grep ^\s*exit\ 0\s*$ /etc/rc.local

c'est que ça ne retourne pas dans le cas où j'ai une ligne avec un

Code:

else exit 0

par exemple.

Donc je ne cherche pas tout caractère d'espacement, mais tout caractère sauf le #.

Par contre

Code:

grep "^[^#]*exit 0" /etc/rc.local

fonctionne très bien, le problème devait se poser avec un caractère spécial qui a été "neutralisé" par les ".
Merci encore.


"Tout est Illusion." (Gautama Bouddha)
"Tout est Amour." (Jésus de Nazareth)
"Tout est Relatif." (Albert Einstein)
"Tout est Fichier." (Ken Thompson)

Hors ligne

 

#4 02-07-2009 21:03:01

maceo
Conseiller de ToulonuX
Lieu: Néoules
Date d'inscription: 09-04-2008
Messages: 540

Re: RegExp

Pour celle qui ne marche pas pour else exit 0 j'avais bien dit "si tu veux exit 0 seul sur sa ligne" donc c'est normal.

En tout cas merci pour ce sujet, j'ai compris la syntaxe de grep. Avant je mettais toujours les / autour de l'expression, c'est pour ça que ça devait merdoyer. Avec les guillemets ça va bien et grep est quand même plus concis que perl -ne 'print if ...
Par contre ça permet aussi de raisonner en "not" en écrivant 'print unless /regexp/' en écrivant la regexp qui donne le contraire de ce qu'on veut. Tu sais si grep peut faire ça ?


Le saint patron des informaticiens, c'est Saint Taxerror

Hors ligne

 

#5 02-07-2009 22:04:40

obibi
Conseiller de ToulonuX
Lieu: Paris
Date d'inscription: 07-04-2008
Messages: 378

Re: RegExp

Code:

$ man grep
[...]
 -v, --invert-match
              Inverser la mise en concordance, pour sélectionner les lignes ne correspondant pas au motif.
              (-v  est  une  spécification POSIX.)

"Tout est Illusion." (Gautama Bouddha)
"Tout est Amour." (Jésus de Nazareth)
"Tout est Relatif." (Albert Einstein)
"Tout est Fichier." (Ken Thompson)

Hors ligne

 

#6 03-07-2009 07:36:14

guillaume
Conseiller de ToulonuX
Lieu: Toulon
Date d'inscription: 08-04-2008
Messages: 134
Site web

Re: RegExp

histoire de bien decomposer tu peut aussi faire un :

Code:

cat  /etc/rc.local | grep -v "#" | grep "exit 0"

c'est sur c'est moi jolie ... mais bon on voit bien le comment du pourquoi ...

ou encore

Code:

cat  /etc/rc.local | grep -vE "#|^[^exit 0]"

Voila ... wink


It's a long way to the top of the kernel compilation
http://berzerking.free.fr/media/images/sign.gif

Hors ligne

 

#7 03-07-2009 08:34:01

obibi
Conseiller de ToulonuX
Lieu: Paris
Date d'inscription: 07-04-2008
Messages: 378

Re: RegExp

guillaume a écrit:

Code:

cat  /etc/rc.local | grep -v "#" | grep "exit 0"

Clair et efficace, mais pour moi le défi était de réussir à le faire en une seule commande. wink

guillaume a écrit:

Code:

cat  /etc/rc.local | grep -vE "#|^[^exit 0]"

celui-ci est marrant mais renvoi aussi toutes les lignes qui ne contiennent pas de #, à cause du "OU".


"Tout est Illusion." (Gautama Bouddha)
"Tout est Amour." (Jésus de Nazareth)
"Tout est Relatif." (Albert Einstein)
"Tout est Fichier." (Ken Thompson)

Hors ligne

 

#8 03-07-2009 08:38:57

guillaume
Conseiller de ToulonuX
Lieu: Toulon
Date d'inscription: 08-04-2008
Messages: 134
Site web

Re: RegExp

c est possible je le test sur mon rc.local perso ... qui est pas bien grand

Code:

berzerking@nabu4lezard:~$ cat  /etc/rc.local | grep -vE "#|^[^exit 0]"

exit 0
berzerking@nabu4lezard:~$ 

berzerking@nabu4lezard:~$ cat /etc/rc.local 
#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.

exit 0
berzerking@nabu4lezard:~$

It's a long way to the top of the kernel compilation
http://berzerking.free.fr/media/images/sign.gif

Hors ligne

 

#9 03-07-2009 08:41:37

guillaume
Conseiller de ToulonuX
Lieu: Toulon
Date d'inscription: 08-04-2008
Messages: 134
Site web

Re: RegExp

Hum bizzard ...
j'ai fait un :

Code:

berzerking@nabu4lezard:~$ cp /etc/rc.local ~
berzerking@nabu4lezard:~$ echo "coucou " >> ~/rc.local
berzerking@nabu4lezard:~$ cat  rc.local | grep -vE "#|^[^exit 0]"

exit 0
berzerking@nabu4lezard:~$

It's a long way to the top of the kernel compilation
http://berzerking.free.fr/media/images/sign.gif

Hors ligne

 

#10 03-07-2009 20:20:02

maceo
Conseiller de ToulonuX
Lieu: Néoules
Date d'inscription: 09-04-2008
Messages: 540

Re: RegExp

@ Bibi: merci pour le RTFM lol

Et pour la suite:

guillaume a écrit:

Code:

berzerking@nabu4lezard:~$ cat  rc.local | grep -vE "#|^[^exit 0]"
$

Alors celle là je la comprends pas du tout ...
Pour moi, [^exit 0] signifie: un seul caractère qui n'est ni e ni x ni i ni t ni espace ni 0.
Donc cette expression devrait renvoyer toutes les lignes qui ne contiennent pas de # et toutes celles qui ne commencent pas par un autre caractère que e,x,i,t,espace ou 0. Autrement dit qui commencent par e,x,i,t,espace ou 0

Ah ben après tests finalement je crois pas avoir tort:

Code:

moi@monpc:~$ cp /etc/rc.local .
moi@monpc:~$ echo coucou >> rc.local 
moi@monpc:~$ echo xoucou >> rc.local 
moi@monpc:~$ echo ioucou >> rc.local 
moi@monpc:~$ echo koucou >> rc.local 
moi@monpc:~$ echo ' koucou' >> rc.local 
moi@monpc:~$ echo toucou >> rc.local 
moi@monpc:~$ echo goucou >> rc.local 
moi@monpc:~$ echo 0oucou >> rc.local 
moi@monpc:~$ cat  rc.local | grep -vE "#|^[^exit 0]"

exit 0
xoucou
ioucou
 koucou
toucou
0oucou

koucou et goucou ne sortent pas.

Dernière modification par maceo (03-07-2009 20:21:12)


Le saint patron des informaticiens, c'est Saint Taxerror

Hors ligne

 

#11 15-08-2009 14:31:32

vladz
Membre du Forum
Date d'inscription: 15-08-2009
Messages: 3

Re: RegExp

J'ai l'impression que ce forum est moins vivant qu'avant, je me décide donc à poster !

Prenons le fichier "exemple":

Code:

$ cat -n exemple
     1  exit 0
     2     exit 0
     3    exit 0 # commentaire
     4      # exit 0
     5  #exit 0
     6  #    exit 0
     7    ### exit 0
     8    test

Si je résume ton besoin, tu souhaites seulement "matcher" les lignes 1, 2 et 3. (La ligne 3 contient un commentaire mais doit être affiché car "exit 0" est bien evidement exécutée).

Construisons maintenant notre expression, je souhaite afficher:

  - Les lignes qui commence par autre chose que "#": "^[^#]"
  - Sur 0 ou plusieurs caractères: "^[^#]*"
  - Suivit de la chaîne "exit 0": "^[^#]*exit 0"

Il s'agit d'une expression simple (pas étendue), donc pas besoin de l'option -E:

Code:

$ grep "^[^#]*exit 0" exemple
exit 0
   exit 0 
  exit 0 # commentaire

a plus,
-vladz.

Hors ligne

 

#12 16-08-2009 21:08:21

obibi
Conseiller de ToulonuX
Lieu: Paris
Date d'inscription: 07-04-2008
Messages: 378

Re: RegExp

Merci Vladz de relancer un peu le forum,
Ma question ayant trouvé réponse depuis le message #3 et puisque ça à l'air de plaire au moins à 4 d'entre nous je propose de se lancer des petits défis  sur les expressions régulières.
Qu'en dites vous? Il y a assez de monde qui n'est pas en vacances?

Allez, une petite:
le fichier /var/log/auth.log contient, entre autres, des messages pour les ouvertures et les fermetures de session SSH.
Comment sortir uniquement les paires de messages d'ouverture/fermeture d'une session SSH?


"Tout est Illusion." (Gautama Bouddha)
"Tout est Amour." (Jésus de Nazareth)
"Tout est Relatif." (Albert Einstein)
"Tout est Fichier." (Ken Thompson)

Hors ligne

 

#13 16-08-2009 21:31:16

vladz
Membre du Forum
Date d'inscription: 15-08-2009
Messages: 3

Re: RegExp

Bonne idée pour les défis. Voici ma proposition:

Code:

egrep "sshd\[[0-9]+\]: .+ session" /var/log/auth.log

Hors ligne

 

#14 17-08-2009 14:29:02

maceo
Conseiller de ToulonuX
Lieu: Néoules
Date d'inscription: 09-04-2008
Messages: 540

Re: RegExp

Ben tu nous as réveillés pendant la sieste estivale !

Code:

grep " sshd\[" /var/log/auth.log

J'ai tenté

Code:

grep "\ssshd\[" /var/log/auth.log

mais \s ne marche pas. Une idée du pourquoi du commentl ?? Théoriquement ça doit remplacer tout caractère d'espacement, en tout cas en perl. D'ailleurs ce code fonctionne:

Code:

perl -ne "print if /\ssshd\[/" < /var/log/auth.log

Le saint patron des informaticiens, c'est Saint Taxerror

Hors ligne

 

#15 17-08-2009 15:06:53

vladz
Membre du Forum
Date d'inscription: 15-08-2009
Messages: 3

Re: RegExp

Parce que la classe "\s" n'est pas définie dans grep, en revanche la classe "[:space:]", oui :

Code:

grep "[[:space:]]sshd\[" /var/log/auth.log

Hors ligne

 

#16 18-08-2009 13:08:02

maceo
Conseiller de ToulonuX
Lieu: Néoules
Date d'inscription: 09-04-2008
Messages: 540

Re: RegExp

Ah merci ! Je vais me coucher un peu moins ignorant ce soir cool
Je croyais que la syntaxe était commune à perl et grep. Dommage.


Le saint patron des informaticiens, c'est Saint Taxerror

Hors ligne

 

#17 18-08-2009 21:34:11

obibi
Conseiller de ToulonuX
Lieu: Paris
Date d'inscription: 07-04-2008
Messages: 378

Re: RegExp

Bon, celle-là était pas trop dure, quelqu'un nous en propose une autre?


"Tout est Illusion." (Gautama Bouddha)
"Tout est Amour." (Jésus de Nazareth)
"Tout est Relatif." (Albert Einstein)
"Tout est Fichier." (Ken Thompson)

Hors ligne

 

Pied de page des forums

Powered by FluxBB