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
Bonjour,

Sous Linux, j'ai un fichier texte nommé fichier.txt, et je cherche à :
1) Compter le nombre de lignes non vides du fichier
2) Lister les lignes contenant un mot particulier
3) Lister les lignes ne contenant pas un mot (ex: lister les lignes ne contenant pas "bonjour)
4) Lister les lignes finissant par un mot particulier (ex:par "fini")
5) Lister les lignes contenant la lettre "à" ou le caractère " ' " (apostrophe)
6) Lister le numéro des lignes vides
7) Lister les lignes contenant des mots ayant au moins deux fois une lettre
8) Lister les lignes commençant par un mot particulier
9) Compter le nombre de lignes commençant par un mot particulier
10) Compter le nombre de mots que cela représente
11) Afficher les 5 dernières lignes contenant le mot "te"
12) Lister les lignes contenant la lettre "g" suivie d'une autre lettre
13) Lister les lignes contenant les lettres "c" ou "f"
14) Classer ce résultat par ordre alphabétique puis l'écrire dans un autre fichier


Mais je ne connais pas bien les commandes encore (je dois OBLIGATOIREMENT utiliser un terminal).
Voici ce que je connais :
1) j'ai cat-b fichier.txt (ce qui me donne 75lignes) ou bien nl (-bt) fichier.txt
2) grep -n bonjour fichier.txt
[6) Vu que je connais le nombre de lignes non vides, je peux faire un nl -ba fichier.txt pour connaitre le nombre total de lignes, et en faisant la soustraction j'aurais la réponse, mais je suppose qu'il existe une commande spéciale pour ça... ]
14) je suppose que je dois faire sort fichier.txt | commande du 13) >fichier2.txt parce que ça marche avec les commandes que je connais.


Voilà, donc si vous pouviez m'aider à trouver les autres, ça serait sympa !! MERCI



PS : Je connais le "GETA" (Google Est Ton Ami) mais je ne trouve pas tout, du tout, et préfèrerais des explications claires... Merci :-)

4 réponses

mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
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 :

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...).
1
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 567
Modifié par lami20j le 25/09/2010 à 13:35
Salut,

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

lami20j@debian-acer:~$ cat plop
mmm^ppp
vvv$zzz
aa-dd
fffgggiii
lami20j@debian-acer:~$ grep '[-]' plop
aa-dd
lami20j@debian-acer:~$ grep '[-q-r]' plop
aa-dd
lami20j@debian-acer:~$ grep '[q-r-]' plop
aa-dd
lami20j@debian-acer:~$ grep '[jk^]' plop
mmm^ppp
lami20j@debian-acer:~$ grep '[$jk]' plop
vvv$zzz
0
Mihawk Messages postés 4313 Date d'inscription mercredi 29 mars 2006 Statut Contributeur Dernière intervention 6 janvier 2015 845
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 :

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.
0
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
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 :

grep "0$" /etc/fstab 


... sort bien de /etc/fstab toutes les lignes qui finissent par un 0.
0
Mihawk Messages postés 4313 Date d'inscription mercredi 29 mars 2006 Statut Contributeur Dernière intervention 6 janvier 2015 845
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à!
0
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
MERCI à tous pour ces réponses bien rapides !!!
Je vais tester tout ça et apprendre à mieux utiliser ces commandes.

Je vous remercie encore,

musicetcie
0
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
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
0
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
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 !!
0
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 567
25 sept. 2010 à 16:01
Re,

Ben, voilà, tu as réussi toute seule. C'est bien ;-)
0
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
:-)

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 !
0
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 567
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.
0
Mihawk Messages postés 4313 Date d'inscription mercredi 29 mars 2006 Statut Contributeur Dernière intervention 6 janvier 2015 845
25 sept. 2010 à 16:06
Alors c'est tout bon ?!
0
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
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 !!
0
Mihawk Messages postés 4313 Date d'inscription mercredi 29 mars 2006 Statut Contributeur Dernière intervention 6 janvier 2015 845
25 sept. 2010 à 16:10
Cool !
0