Précédent   Forum des professionnels en informatique > Systèmes > Linux > Applications > Shell
Shell Vos questions sur l'utilisation des commandes shell
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 30/03/2008, 22h38   #1
Membre du Club
 
Inscription : mars 2006
Messages : 158
Détails du profil
Informations forums :
Inscription : mars 2006
Messages : 158
Points : 48
Points : 48
Par défaut ?grep et expression régulière

Bonjour,

Dans un fichier a.txt :

Code :
1
2
3
4
5
6
%SystemRoot%\abcd?.exe
%SystemRoot%\abcd.exe
%SystemRoot%\abc?.exe
%SystemRoot%\abcd1.exe
%SystemRoot%\abcdkz.exe
%SystemRoot%\abcd???.exe
comment faire pour trouver toutes les lignes qui répondent exactement à ces 3 critères :
- commencent par %SystemRoot%\abc,
- suivi d'un unique caractère quelconque,
- et enfin de l'expression ".exe" ?

ceci pour arriver à afficher simplement :

Code :
1
2
%SystemRoot%\abcd.exe
%SystemRoot%\abc?.exe
Bien sur j'ai essayé un grand nombre de combinaisons avec grep -n, egrep -n et fgrep (il me faut les numéros de ligne), mais cela ne donne rien de convaincant. De plus je suis sur un pb bien plus complexe mais je 'aperçois déjà que ça coince à ce niveau

Merci pour votre aide
eZula est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/03/2008, 15h30   #2
Membre actif
 
Étudiant
Inscription : août 2006
Messages : 168
Détails du profil
Informations personnelles :
Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : août 2006
Messages : 168
Points : 170
Points : 170
si tu n'est pas obligé de te servir de grep, tu peux utiliser awk :

Code :
more a.txt | awk '/%SystemRoot%\abc/ {print $0}'
j'ai pas testé.
il faut suremement mettre des \ devant les caractères spéciaux...
gregory2526 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/03/2008, 15h53   #3
Membre du Club
 
Inscription : mars 2006
Messages : 158
Détails du profil
Informations forums :
Inscription : mars 2006
Messages : 158
Points : 48
Points : 48
salut,

je viens de tester ta commande, avec une protection \ pour le slash, mais ça ne matche pas exactement les deux lignes visées

résultat attendu :

Code :
1
2
%SystemRoot%\abcd.exe
%SystemRoot%\abc?.exe
réultat effectif :

Code :
1
2
3
4
5
6
7
more a.txt | awk '/%SystemRoot%\\abc/ {print $0}'
%SystemRoot%\abcd?.exe
%SystemRoot%\abcd.exe
%SystemRoot%\abc?.exe
%SystemRoot%\abcd1.exe
%SystemRoot%\abcdkz.exe
%SystemRoot%\abcd???.exe
pour la nécessité de ?grep, je sais pas, mais par contre j'ai besoin des n° de ligne où l'expression visée correspond.

Je précise que a.txt n'est qu'un échantillon
Ca me gave de bloquer la dessus depuis deux jours

Merci
eZula est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/03/2008, 16h30   #4
Membre émérite
 
Inscription : novembre 2007
Messages : 553
Détails du profil
Informations forums :
Inscription : novembre 2007
Messages : 553
Points : 876
Points : 876
Bonjour.
Code :
grep "^\%SystemRoot\%.abc.\.exe$" a.txt
C'est presque ce que tu désires (j'ai remplacé le caractère \ par un caractère quelconque).
vinc-mai est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/03/2008, 16h33   #5
Nouveau Membre du Club
 
Inscription : janvier 2008
Messages : 81
Détails du profil
Informations personnelles :
Âge : 26

Informations forums :
Inscription : janvier 2008
Messages : 81
Points : 34
Points : 34
essaie ceci sinon ca devrait fonctionner

Code :
1
2
 
 grep -n '^%SystemRoot%\\abc.\.exe' a.txt
panach91 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/03/2008, 17h00   #6
Membre du Club
 
Inscription : mars 2006
Messages : 158
Détails du profil
Informations forums :
Inscription : mars 2006
Messages : 158
Points : 48
Points : 48
Ok, impeccable ça marche

Code :
1
2
3
grep -n '^%SystemRoot%\\abc.\.exe' a.txt
2:%SystemRoot%\abcd.exe
3:%SystemRoot%\abc?.exe
maintenant, voici une approche plus précise du pb final : %SystemRoot%\abc est une variable

Code :
1
2
3
a="%SystemRoot%\abc"
echo $a
SystemRoot%\abc
jusque là pas de pb. Je voudrais donc lancer une recherche équivalente à ci-dessus mais plus générale, quelque chose comme :

Code :
grep -n '^"$a".\.exe' a.txt
Malheureusement ça ne marche pas, avec ou sans guillemets...

Apparemment ce ne sont pas les antislash qui posent pb, exemple

Code :
1
2
3
4
5
6
7
8
9
10
11
b=coucou
 
cat b.txt
Coucou.exe
coucoux.exe
coucouz.exe
coucou?.exe
couccousx.sys
coucou.dll
 
grep -n '"$b".\.exe' b.txt
=> aucun résultat
eZula est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/03/2008, 17h11   #7
Nouveau Membre du Club
 
Inscription : janvier 2008
Messages : 81
Détails du profil
Informations personnelles :
Âge : 26

Informations forums :
Inscription : janvier 2008
Messages : 81
Points : 34
Points : 34
ne mets pas de guillemet mais des quotes et voit

Code :
1
2
 
grep -n '^'$b'.\.exe' b.txt
panach91 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/03/2008, 17h15   #8
Membre émérite
 
Inscription : novembre 2007
Messages : 553
Détails du profil
Informations forums :
Inscription : novembre 2007
Messages : 553
Points : 876
Points : 876
La fonction eval donnera peut-être des résutats.
Code :
1
2
a=System
eval 'grep -e $a a.txt'
Citation:
%SystemRoot%\abcd.exe
%SystemRoot%\abc?.exe
%SystemRoot%\abcd1.exe
%SystemRoot%\abcdkz.exe
%SystemRoot%\abcd???.exe
edit: autre piste.
Code :
1
2
c="$b".\.exe
grep -e $c b.txt
vinc-mai est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/04/2008, 21h30   #9
Membre du Club
 
Inscription : mars 2006
Messages : 158
Détails du profil
Informations forums :
Inscription : mars 2006
Messages : 158
Points : 48
Points : 48
Bonjour

merci pour vos réponses. J'ai besoin d'un peu de temps pour décanter tout ça et surtout multiplier des essais. Comme ça, à priori, je dirais que les deux dernières solutions proposées fonctionnent bien, là où ça semble poser problème c'est en application dans une boucle for

J'espère pouvoir vous tenir au courant rapidement
eZula est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/04/2008, 15h09   #10
Membre du Club
 
Inscription : mars 2006
Messages : 158
Détails du profil
Informations forums :
Inscription : mars 2006
Messages : 158
Points : 48
Points : 48
J'ai repris les recherches et comme dit plus haut il semblerait que dans une boucle ça ne marche plus :

dans un premier temps je souhaite isoler tous les fichiers exe de ce fichier échantillon a.txt vers le fichier Exe.txt, en leur amputant les 4 derniers caractères en partant de la droite (pour enlever l'expression ".exe") :

Code :
1
2
3
4
5
6
7
%SystemRoot%\abcd?.exe
%SystemRoot%\abcd.exe
%SystemRoot%\abc?.exe
%SystemRoot%\abcd1.exe
%SystemRoot%\abcdkz.exe
%SystemRoot%\abcd???.exe
%SystemDrivet%\abcd???.dll
avec la commande suivante :

Code :
1
2
3
for i in $(grep '\.exe$' a.txt)
do echo `expr "$i" : "\(.*\)......$"` >> Exe.txt
done
Le fichier Exe.txt est donc :

Code :
1
2
3
4
5
6
%SystemRoot%\abcd
%SystemRoot%\abc
%SystemRoot%\abc
%SystemRoot%\abcd
%SystemRoot%\abcdk
%SystemRoot%\abcd??
maintenant je souhaite que pour chaque doublon rencontré dans Exe.txt, il donne la ligne correspondante de ce doublon dans le fichier d'origine a.txt, ainsi qu'une proposition de remplacement (qui ne se fait pas automatiquement, c'est pas le but ici), en respectant le fait que ce doublon doit impérativement se terminer par 4 caractères supplémentaires dont l'expression ".exe", autrement dit, DoublonCaractère_quelconque.exe

Code :
for i in $(uniq -d Exe.txt); do  echo "Suggestion : "$i"?.exe" >> Doublons.txt; fgrep -n "$i" a.txt >> Doublons.txt; echo >> Doublons.txt; done
le résultat obtenu est le suivant

Code :
1
2
3
4
5
6
7
Suggestion : %SystemRoot%\abc?.exe
1:%SystemRoot%\abcd?.exe
2:%SystemRoot%\abcd.exe
3:%SystemRoot%\abc?.exe
4:%SystemRoot%\abcd1.exe
5:%SystemRoot%\abcdkz.exe
6:%SystemRoot%\abcd???.exe
alors que le résultat attendu devrait être :

Code :
1
2
3
Suggestion : %SystemRoot%\abc?.exe
1:%SystemRoot%\abc?.exe
2:%SystemRoot%\abcd.exe
et là même avec vos propositions ça coince, soit il liste TOUT se qui commence par "doublon" sans tenir compte de la contrainte des 4 caractères, soit il ne liste aucune ligne commençant par Doublon

Merci pour une piste
eZula est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/04/2008, 17h39   #11
Membre émérite
 
Inscription : mai 2004
Messages : 709
Détails du profil
Informations personnelles :
Localisation : Belgique

Informations forums :
Inscription : mai 2004
Messages : 709
Points : 852
Points : 852
Essaye en modifiant ceci dans ton script:

Code :
(...) egrep -n "$i".\.exe a.txt (...)
__________________
:q :q! :wq :w :w! :wq! :quit :quit! :help help helpquit quit quithelp
:quitplease :quitnow :leave :shit ^X^C ^C ^D ^Z ^Q QUITDAMMIT
Jabber: ripat at im.apinc.org
ripat est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/04/2008, 17h49   #12
Membre du Club
 
Inscription : mars 2006
Messages : 158
Détails du profil
Informations forums :
Inscription : mars 2006
Messages : 158
Points : 48
Points : 48
merci, mais ça ne fonctionne pas plus. La ligne "suggestion" apparait bien et justement, mais la liste des lignes concernées non...
eZula est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 23h22.


 
 
 
 
Partenaires

Hébergement Web