Unix -- Lister des lignes...
Résolu
musicetcie
-
lami20j Messages postés 21331 Date d'inscription Statut Modérateur, Contributeur sécurité Dernière intervention -
lami20j Messages postés 21331 Date d'inscription Statut Modérateur, Contributeur sécurité Dernière intervention -
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 :-)
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 :-)
A voir également:
- Unix -- Lister des lignes...
- Partager des photos en ligne - Guide
- Lister les disques cmd - Guide
- Liste des appareils connectés - Guide
- Excel trier par ordre alphabétique en gardant les lignes - Guide
- Écrire plusieurs lignes dans une cellule excel mac - Guide
4 réponses
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...).
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.
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.
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
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
:-)
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 !
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