Unix -- Lister des lignes...
Résolu/Fermé
musicetcie
-
24 sept. 2010 à 23:22
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 - 25 sept. 2010 à 19:24
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 - 25 sept. 2010 à 19:24
A voir également:
- Unix -- Lister des lignes...
- Excel trier par ordre alphabétique en gardant les lignes - Guide
- Partager des photos en ligne - Guide
- Gertrude a préparé la liste des affaires à prendre pour l'excursion. juliette a modifié cette liste en utilisant le mode suivi des modifications proposé par le traitement de texte. - Guide
- Excel validation des données liste - Guide
- Triez cette liste par ordre alphabétique des villes et par note de la meilleure à la moins bonne. quel mot est formé par les 8 premières lettres de la colonne code ? ✓ - Forum Excel
4 réponses
mamiemando
Messages postés
33397
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
28 novembre 2024
7 804
Modifié par mamiemando le 25/09/2010 à 13:06
Modifié par mamiemando le 25/09/2010 à 13:06
Lis un cours sur les expressions rationnelles et regarde comment fonctionne la commande grep en tapant dans google où dans un terminal :
Résumé d'un cours sur les expression régulières :
- Une expression régulière (ou expression rationnelle) est une chaîne de caractère qui représente un ensemble de chaînes de caractères. Elle s'appuie pour cela sur des caractères spéciaux (les méta-caractères) qui font office d'opérateur.
- Une expression rationnelle est convertie en automate fini (déterministe) qui sert à voir si une chaîne (typiquement une ligne d'un fichier) respecte ou nom le motif décrit par l'expression régulière.
- ^ signifie que le motif doit figurer en début de ligne (^toto). Si on voulait parler du caractère ^ il faudrait écrire [^] ou \^.
- $ signifie que le motif doit figurer en fin de ligne (toto$)
- Ainsi ^toto$ signifie que la ligne contient exactement toto. Une ligne vide est donc représentable par ^$.
- Les expressions régulières implémentent des opérateurs de répétition (?, *, +, ...). Certains ne sont pas supportés par tous les moteurs d'expressions régulières (typiquement les opérateur {n}, {n,m}...) mais tu n'en auras pas besoin. Par exemple "a{3}(bc){4}" décrit la chaîne "aaabcbcbcbc".
- ? est équivalent à {0,1} (entre 0 et 1 répétition). Ainsi "a?bc" désigne "abc" ou "bc".
- + est équivalent à {1,+infini}
- * est équivalent à {0,+infini}
- On peut appliquer ces opérateurs à une famille de caractères (classe de caractères). Par exemple (a|b|e) désigne les caractères a ou b ou e. Ainsi "(a|b|e){3}" regroupe notamment les chaînes "aaa", "aeb", "abb", "eba"...
- L'opérateur [ ] permet de désigner des caractères consécutifs. Par exemple [a-zA-Z0-9] désigne les caractères alphanumériques. On peut désigner l'ensemble de caractères contraire avec l'opérateur ^ (par exemple [^a-z] : un caractère qui n'est pas une lettre minuscule). Attention à ne pas oublier le \ si tu veux parler du caractère "-" ou de "^" dans un [ ].
- Le métacaractère "." désigne n'importe quel caractère sauf \0 (fin de chaîne) \n (retour à la ligne), \t (tabulation) et \r (retour chariot). Si tu veux parler du caractère ., il faut soit écrire \., soit [.].
- La syntaxe peut différer légèrement d'un moteur d'expression régulière à l'autre (sed, vim, grep, egrep, perl...).
Les expressions rationnelles sont également expliquées dans man grep. La plupart des questions consistent à trouver les bonnes options à passer à grep (-n, -v, -c, -i ...).
Pour certaines questions on peut traiter le résultat de grep avec un pipe (prononcer païpe), appelé également tube. Si tu ne sais pas ce que c'est, regarde un cours sur le shell (par exemple sur bash). Dans certaines question, ce tube peut être suivi d'un wc, d'un tail, d'un sort ou d'un cut bien choisi.
Pas besoin de redirections (>, >>, 1>, 1>>, 2>, 2>>, <) si on omet les quelques rares points qui peuvent être traités par des pipes (appelés également tubes, on se demande pourquoi...).
man grep
Résumé d'un cours sur les expression régulières :
- Une expression régulière (ou expression rationnelle) est une chaîne de caractère qui représente un ensemble de chaînes de caractères. Elle s'appuie pour cela sur des caractères spéciaux (les méta-caractères) qui font office d'opérateur.
- Une expression rationnelle est convertie en automate fini (déterministe) qui sert à voir si une chaîne (typiquement une ligne d'un fichier) respecte ou nom le motif décrit par l'expression régulière.
- ^ signifie que le motif doit figurer en début de ligne (^toto). Si on voulait parler du caractère ^ il faudrait écrire [^] ou \^.
- $ signifie que le motif doit figurer en fin de ligne (toto$)
- Ainsi ^toto$ signifie que la ligne contient exactement toto. Une ligne vide est donc représentable par ^$.
- Les expressions régulières implémentent des opérateurs de répétition (?, *, +, ...). Certains ne sont pas supportés par tous les moteurs d'expressions régulières (typiquement les opérateur {n}, {n,m}...) mais tu n'en auras pas besoin. Par exemple "a{3}(bc){4}" décrit la chaîne "aaabcbcbcbc".
- ? est équivalent à {0,1} (entre 0 et 1 répétition). Ainsi "a?bc" désigne "abc" ou "bc".
- + est équivalent à {1,+infini}
- * est équivalent à {0,+infini}
- On peut appliquer ces opérateurs à une famille de caractères (classe de caractères). Par exemple (a|b|e) désigne les caractères a ou b ou e. Ainsi "(a|b|e){3}" regroupe notamment les chaînes "aaa", "aeb", "abb", "eba"...
- L'opérateur [ ] permet de désigner des caractères consécutifs. Par exemple [a-zA-Z0-9] désigne les caractères alphanumériques. On peut désigner l'ensemble de caractères contraire avec l'opérateur ^ (par exemple [^a-z] : un caractère qui n'est pas une lettre minuscule). Attention à ne pas oublier le \ si tu veux parler du caractère "-" ou de "^" dans un [ ].
- Le métacaractère "." désigne n'importe quel caractère sauf \0 (fin de chaîne) \n (retour à la ligne), \t (tabulation) et \r (retour chariot). Si tu veux parler du caractère ., il faut soit écrire \., soit [.].
- La syntaxe peut différer légèrement d'un moteur d'expression régulière à l'autre (sed, vim, grep, egrep, perl...).
Les expressions rationnelles sont également expliquées dans man grep. La plupart des questions consistent à trouver les bonnes options à passer à grep (-n, -v, -c, -i ...).
Pour certaines questions on peut traiter le résultat de grep avec un pipe (prononcer païpe), appelé également tube. Si tu ne sais pas ce que c'est, regarde un cours sur le shell (par exemple sur bash). Dans certaines question, ce tube peut être suivi d'un wc, d'un tail, d'un sort ou d'un cut bien choisi.
man cut man tail man wc man sort
Pas besoin de redirections (>, >>, 1>, 1>>, 2>, 2>>, <) si on omet les quelques rares points qui peuvent être traités par des pipes (appelés également tubes, on se demande pourquoi...).
Mihawk
Messages postés
4315
Date d'inscription
mercredi 29 mars 2006
Statut
Contributeur
Dernière intervention
6 janvier 2015
846
Modifié par Mihawk le 25/09/2010 à 12:51
Modifié par Mihawk le 25/09/2010 à 12:51
Hello !
Je pense que tu t'y prends un peu mal...
Pour compter le nombre de lignes, par exemple, tu ferais mieux d'utiliser la commande :
Pour la recherche utilises la fonction grep (comme tu fais déjà).
Pour chercher le mot à la fin de la ligne, utilise l'option -E qui autorise l'utilisation d'expressions régulières.
Pour plus d'infos :
Les commandes très utiles :
https://openclassrooms.com/fr/courses/43538-reprenez-le-controle-a-laide-de-linux/40172-extraire-trier-et-filtrer-des-donnees#ss_part_1
Les expressions régulières :
https://openclassrooms.com/fr/courses/918836-concevez-votre-site-web-avec-php-et-mysql/916990-les-expressions-regulieres-partie-1-2
Si tu n'y arrives vraiment pas, dis-le moi et je t'aiderai plus !
Tant qu'on ne fait pas, on ne sait pas.
Je pense que tu t'y prends un peu mal...
Pour compter le nombre de lignes, par exemple, tu ferais mieux d'utiliser la commande :
wc -l <tonfichier>
Pour la recherche utilises la fonction grep (comme tu fais déjà).
grep <mot> <tonfichier>
Pour chercher le mot à la fin de la ligne, utilise l'option -E qui autorise l'utilisation d'expressions régulières.
grep -E <mot>$ <tonfichier>
Pour plus d'infos :
Les commandes très utiles :
https://openclassrooms.com/fr/courses/43538-reprenez-le-controle-a-laide-de-linux/40172-extraire-trier-et-filtrer-des-donnees#ss_part_1
Les expressions régulières :
https://openclassrooms.com/fr/courses/918836-concevez-votre-site-web-avec-php-et-mysql/916990-les-expressions-regulieres-partie-1-2
Si tu n'y arrives vraiment pas, dis-le moi et je t'aiderai plus !
Tant qu'on ne fait pas, on ne sait pas.
mamiemando
Messages postés
33397
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
28 novembre 2024
7 804
Modifié par mamiemando le 25/09/2010 à 13:11
Modifié par mamiemando le 25/09/2010 à 13:11
Quelques précisions :
Pour compter le nombre de lignes, par exemple, tu ferais mieux d'utiliser la commande : wc -l <tonfichier>
Ou l'option -c de grep.
Pour chercher le mot à la fin de la ligne, utilise l'option -E qui autorise l'utilisation d'expressions régulières.
grep -E <mot>$ <tonfichier>
Cette option n'est pas nécessaire pour manipuler des expressions régulières avec grep en particulier le métacaractère $. Exemple :
... sort bien de /etc/fstab toutes les lignes qui finissent par un 0.
Pour compter le nombre de lignes, par exemple, tu ferais mieux d'utiliser la commande : wc -l <tonfichier>
Ou l'option -c de grep.
Pour chercher le mot à la fin de la ligne, utilise l'option -E qui autorise l'utilisation d'expressions régulières.
grep -E <mot>$ <tonfichier>
Cette option n'est pas nécessaire pour manipuler des expressions régulières avec grep en particulier le métacaractère $. Exemple :
grep "0$" /etc/fstab
... sort bien de /etc/fstab toutes les lignes qui finissent par un 0.
Mihawk
Messages postés
4315
Date d'inscription
mercredi 29 mars 2006
Statut
Contributeur
Dernière intervention
6 janvier 2015
846
25 sept. 2010 à 13:51
25 sept. 2010 à 13:51
Merci de ces corrections. Personnellement je préfère ajouter le -E pour une meilleure visibilité.
Enfin, le problème n'était pas là!
Enfin, le problème n'était pas là!
musicetcie
Messages postés
391
Date d'inscription
mardi 10 juin 2008
Statut
Membre
Dernière intervention
24 mars 2013
97
25 sept. 2010 à 14:29
25 sept. 2010 à 14:29
MERCI à tous pour ces réponses bien rapides !!!
Je vais tester tout ça et apprendre à mieux utiliser ces commandes.
Je vous remercie encore,
musicetcie
Je vais tester tout ça et apprendre à mieux utiliser ces commandes.
Je vous remercie encore,
musicetcie
musicetcie
Messages postés
391
Date d'inscription
mardi 10 juin 2008
Statut
Membre
Dernière intervention
24 mars 2013
97
25 sept. 2010 à 15:52
25 sept. 2010 à 15:52
alors, pour vous donner un peu les résultats, j'ai réussi, en plus, à faire:
4) grep -ni fini$ fichier.txt --> ça m'a listé les 4lignes correspondantes
5) grep -ni [à \ ' ] fichier.txt mais le pb, c'est que tellement de lignes correspondent !! --> du coup j'ai ajouté | nl pour qu'il m'affiche la numérotation des lignes : la dernière est la n°43donc il y a 43lignes contenant à ou apostrophe)
6) grep -n ^$ fichier.txt --> me liste les lignes vides (ici 6 en tout)
7) grep -n ll fichier.txt (pour la lettre l)
8) grep -ni ^bien fichier.txt (pour le mot bien) --> me liste 4 lignes
9) idem avec un autre mot que bien
10) remettre la commande du 9 suivi de | wc -w
11) grep " te " fichier.txt
12) grep -n " g" fichier.txt
13) grep -n [ gz ] fichier.txt
14) grep [ gz ] fichier.txt | sort
Evidemment là j'est beaucoup espacé, ce que je n'ai pas fait dans mon terminal...
Enfin... voilà !! du coup, j'ai tout... sauf la 3 que je n'ai pas du tout réussie :-( Une idée ??
MERCI A VOUS
4) grep -ni fini$ fichier.txt --> ça m'a listé les 4lignes correspondantes
5) grep -ni [à \ ' ] fichier.txt mais le pb, c'est que tellement de lignes correspondent !! --> du coup j'ai ajouté | nl pour qu'il m'affiche la numérotation des lignes : la dernière est la n°43donc il y a 43lignes contenant à ou apostrophe)
6) grep -n ^$ fichier.txt --> me liste les lignes vides (ici 6 en tout)
7) grep -n ll fichier.txt (pour la lettre l)
8) grep -ni ^bien fichier.txt (pour le mot bien) --> me liste 4 lignes
9) idem avec un autre mot que bien
10) remettre la commande du 9 suivi de | wc -w
11) grep " te " fichier.txt
12) grep -n " g" fichier.txt
13) grep -n [ gz ] fichier.txt
14) grep [ gz ] fichier.txt | sort
Evidemment là j'est beaucoup espacé, ce que je n'ai pas fait dans mon terminal...
Enfin... voilà !! du coup, j'ai tout... sauf la 3 que je n'ai pas du tout réussie :-( Une idée ??
MERCI A VOUS
musicetcie
Messages postés
391
Date d'inscription
mardi 10 juin 2008
Statut
Membre
Dernière intervention
24 mars 2013
97
25 sept. 2010 à 15:55
25 sept. 2010 à 15:55
A moins que..... :-)
j'ai fait grep -nv bonjour fichier.txt
en rajoutant l'option v j'inverse le résultat... je n'avais pas vu ça dans man grep, avant !!
Merci encore !!
j'ai fait grep -nv bonjour fichier.txt
en rajoutant l'option v j'inverse le résultat... je n'avais pas vu ça dans man grep, avant !!
Merci encore !!
lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 569
25 sept. 2010 à 16:01
25 sept. 2010 à 16:01
Re,
Ben, voilà, tu as réussi toute seule. C'est bien ;-)
Ben, voilà, tu as réussi toute seule. C'est bien ;-)
musicetcie
Messages postés
391
Date d'inscription
mardi 10 juin 2008
Statut
Membre
Dernière intervention
24 mars 2013
97
25 sept. 2010 à 16:08
25 sept. 2010 à 16:08
:-)
et pourriez vous me dire comment je liste les fichiers de mon arborescence qui ont le droit en lecture et exécution pour un utilisateur ??
Je ne vois pas du tout comment faire, là encore
Je sais lister des fichiers, modifier leurs droits mais pas afficher des fichiers selon ces droits...
merci !
et pourriez vous me dire comment je liste les fichiers de mon arborescence qui ont le droit en lecture et exécution pour un utilisateur ??
Je ne vois pas du tout comment faire, là encore
Je sais lister des fichiers, modifier leurs droits mais pas afficher des fichiers selon ces droits...
merci !
lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 569
Modifié par lami20j le 25/09/2010 à 16:18
Modifié par lami20j le 25/09/2010 à 16:18
Re,
Je sais lister des fichiers, modifier leurs droits mais pas afficher des fichiers selon ces droits...
Tu peux utiliser la commande find
Regarde man find et son option -perm
A la fin dans main tu as des exemples.
Je sais lister des fichiers, modifier leurs droits mais pas afficher des fichiers selon ces droits...
Tu peux utiliser la commande find
Regarde man find et son option -perm
A la fin dans main tu as des exemples.
Mihawk
Messages postés
4315
Date d'inscription
mercredi 29 mars 2006
Statut
Contributeur
Dernière intervention
6 janvier 2015
846
25 sept. 2010 à 16:06
25 sept. 2010 à 16:06
Alors c'est tout bon ?!
musicetcie
Messages postés
391
Date d'inscription
mardi 10 juin 2008
Statut
Membre
Dernière intervention
24 mars 2013
97
25 sept. 2010 à 16:09
25 sept. 2010 à 16:09
peut être qu'il y a plus simple, je ne sais pas (enfin là ces commandes ne sont pas très compliquées, en fait ^^), mais en tout cas TOUT FONCTIONNE !!
Mihawk
Messages postés
4315
Date d'inscription
mercredi 29 mars 2006
Statut
Contributeur
Dernière intervention
6 janvier 2015
846
25 sept. 2010 à 16:10
25 sept. 2010 à 16:10
Cool !
Modifié par lami20j le 25/09/2010 à 13:35
Attention à ne pas oublier le \ si tu veux parler du caractère "-" ou de "^" dans un [ ].
Pour le tiret - on peut soit utiliser le \ soit en le mettant dans la première ou dernière position de la classe
[-a-z] - reconnaît le tiret ainsi que tous les lettres minuscules entre a et z.
Pareil pour ^ si on le mets à la fin ou $ au début, avec la précision qu'on n'utilise pas des modificateurs de regex single ou multi line