Vous n'êtes pas identifié.
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.
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:
$ 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 ?
Hors ligne
Une idée autrement, parce que je n'ai jamais compris comment utiliser les regexp avec grep:
perl -ne "print if /^[^#]*exit 0/" /etc/rc.local
Si tu veux exit 0 seul sur sa ligne:
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:
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)
Hors ligne
Ok, merci maceo.
Le problème avec
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
else exit 0
par exemple.
Donc je ne cherche pas tout caractère d'espacement, mais tout caractère sauf le #.
Par contre
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.
Hors ligne
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 ?
Hors ligne
$ 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.)
Hors ligne
histoire de bien decomposer tu peut aussi faire un :
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
cat /etc/rc.local | grep -vE "#|^[^exit 0]"
Voila ...
Hors ligne
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.
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".
Hors ligne
c est possible je le test sur mon rc.local perso ... qui est pas bien grand
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:~$
Hors ligne
Hum bizzard ...
j'ai fait un :
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:~$
Hors ligne
@ Bibi: merci pour le RTFM
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:
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)
Hors ligne
J'ai l'impression que ce forum est moins vivant qu'avant, je me décide donc à poster !
Prenons le fichier "exemple":
$ 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:
$ grep "^[^#]*exit 0" exemple exit 0 exit 0 exit 0 # commentaire
a plus,
-vladz.
Hors ligne
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?
Hors ligne
Bonne idée pour les défis. Voici ma proposition:
egrep "sshd\[[0-9]+\]: .+ session" /var/log/auth.log
Hors ligne
Ben tu nous as réveillés pendant la sieste estivale !
grep " sshd\[" /var/log/auth.log
J'ai tenté
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:
perl -ne "print if /\ssshd\[/" < /var/log/auth.log
Hors ligne
Parce que la classe "\s" n'est pas définie dans grep, en revanche la classe "[:space:]", oui :
grep "[[:space:]]sshd\[" /var/log/auth.log
Hors ligne
Ah merci ! Je vais me coucher un peu moins ignorant ce soir
Je croyais que la syntaxe était commune à perl et grep. Dommage.
Hors ligne
Bon, celle-là était pas trop dure, quelqu'un nous en propose une autre?
Hors ligne