Nous utilisons des cookies pour améliorer votre expérience. En poursuivant votre navigation sur ce site, vous acceptez l'utilisation de cookies.


Politique de confidentialité

Recherche dans le contenu des fichiers (grep, cut, tr, paste, sort)

 

Recherche dans le contenu des fichiers (grep, cut, tr, paste, sort)

La plus grande force de Linux est sans doute la manipulation de texte : il s'agit de donner à un fichier texte (ou à une entrée standard) la forme souhaitée en appliquant des transformations, souvent dans un pipeline. Tout programme qui lit l'entrée standard et écrit la sortie standard entre dans cette catégorie, mais nous allons présenter ici certains des outils les plus importants.

A travers ce cours, nous utiliserons le fichier editeur qui contient le texte suivant :

Pour entrer en mode de saisie, tapez une lettre de commande de saisie. Pour commencer, tapez l'une des lettres suivantes. Lorsque vous avez terminé de saisir du texte, appuyez sur la touche Echap (parfois deux fois) pour revenir au mode commande.
a - La commande ajouter. Avec cette commande, vous pouvez saisir du texte qui commence à droite du curseur.
A - La commande ajouter à la fin. Avec cette commande, vous pouvez saisir du texte en commençant à la fin de la ligne courante.
i - La commande d'insertion. Avec cette commande, vous pouvez saisir du texte qui commence à gauche du curseur.
I - La commande d'insertion au début. Avec cette commande, vous pouvez saisir du texte qui commence au début de la ligne actuelle.
o - Cette commande ouvre une ligne sous la ligne courante et vous met en mode insertion.
O - Cette commande ouvre une ligne au-dessus de la ligne courante et vous met en mode insertion.

grep

La commande grep est l'une des commandes les plus utiles et les plus puissantes de Linux. Son principe est simple : étant donné un ou plusieurs fichiers, affichez toutes les lignes de ces fichiers qui correspondent à un modèle d'expression régulière particulier.

grep [options] motif [fichiers]

Exemple 1

Rechercher toutes les lignes contenant le mot insertion

devinfo@ubuntu:~$ grep insertion editeur
i - La commande d'insertion. Avec cette commande, vous pouvez saisir du texte qui commence à gauche du curseur.
I - La commande d'insertion au début. Avec cette commande, vous pouvez saisir du texte qui commence au début de la ligne actuelle.
o - Cette commande ouvre une ligne sous la ligne courante et vous met en mode insertion.
O - Cette commande ouvre une ligne au-dessus de la ligne courante et vous met en mode insertion.
Exemple 2

Maintenant, nous utilisons une expression régulière pour faire correspondre les lignes se terminant par le mot 'insertion.' :

devinfo@ubuntu:~$ grep 'insertion.$' editeur
o - Cette commande ouvre une ligne sous la ligne courante et vous met en mode insertion.
O - Cette commande ouvre une ligne au-dessus de la ligne courante et vous met en mode insertion.

grep peut utiliser deux types différents d'expressions régulières, qu'il appelle basic et extended. Elles sont tout aussi puissantes, mais différentes, et vous pouvez préférer l'une à l'autre en fonction de votre expérience avec d'autres implémentations de grep. La syntaxe de base est présentée dans le tableau ci-dessous. Les expressions régulières valent bien la peine que vous preniez le temps de les apprendre. D'autres programmes Linux puissants les utilisent également, comme sed et perl.

BasiqueEtendueDescription
.
Tout caractère unique.
[...]
Correspond à n'importe quel caractère de cette liste.
[^...]
Faites correspondre n'importe quel caractère ne figurant PAS dans cette liste.
(...)
Regroupement.
\||Ou
^
Début de la ligne
$
fin de la ligne
\<
début d'un mot
\>
fin d'un mot
[:alnum:]
Tout caractère alphanumérique.
[:alpha:]
Tout caractère alphabétique.
[:cntrl:]
Tout caractère de contrôle.
[:digit:]
N'importe quel chiffre.
[:graph:]
Tout caractère graphique.
[:lower:]
Toute lettre minuscule.
[:print:]
Tout caractère imprimable.
[:punct:]
Tout signe de ponctuation.
[:space:]
Tout caractère d'espacement.
[:upper:]
Toute lettre majuscule.
[:xdigit:]
Tout chiffre hexadécimal.
*
Zéro ou plusieurs répétitions d'une expression régulière.
\++Une ou plusieurs répétitions d'une expression régulière.
\??Zéro ou une occurrence d'une expression régulière.
\{n \}{n}Exactement n répétitions d'une expression régulière.
\{ n ,\}{n, }n répétitions ou plus d'une expression régulière.
\{ n , m\}{n, m}Entre n et m (inclus) répétitions d'une expression régulière, n < m.
\c
Le caractère littéral c, même si c est un caractère d'expression régulière spéciale. Par exemple, utilisez \* pour faire correspondre un astérisque ou \\ pour faire correspondre une barre oblique inverse. Vous pouvez également mettre le caractère littéral entre crochets, comme [*] ou [\].
Options utiles
  •  -v : Affiche uniquement les lignes qui ne correspondent pas à l'expression régulière.
  •  -l : Affiche uniquement les noms des fichiers qui contiennent des lignes correspondantes, pas les lignes elles-mêmes.
  •  -L : Affiche uniquement les noms des fichiers qui ne contiennent pas de lignes correspondantes.
  •  -c : Affiche uniquement le nombre de lignes correspondantes.
  •  -n : Devant chaque ligne de sortie correspondante, affiche son numéro de ligne d'origine.
  •  -b : Devant chaque ligne de sortie correspondante, affiche le décalage d'octet de la ligne dans le fichier d'entrée.
  •  -i : Correspondance insensible à la casse.
  •  -w : Faites correspondre uniquement les mots complets (c'est-à-dire les mots qui correspondent à l'intégralité de l'expression régulière).
  •  -x : Faites correspondre uniquement les lignes complètes (c'est-à-dire les lignes qui correspondent à l'intégralité de l'expression régulière). Remplace -w.
  •  -A N : Après chaque ligne correspondante, affiche les N lignes suivantes de son fichier.
  •  -B N : Avant chaque ligne correspondante, affiche les N lignes précédentes de son fichier.
  •  -C N : Identique à -A N -B N : affiche N lignes (du fichier d'origine) au-dessus et en dessous de chaque ligne correspondante.
  •  -r : Recherchez récursivement tous les fichiers d'un répertoire et de ses sous-répertoires.
  •  -E : Utilisez des expressions régulières étendues (egrep).
  •  -F : Utilisez des listes de chaînes fixes au lieu d'expressions régulières (fgrep).
Exemple 3 :
devinfo@ubuntu:~$ grep -n insertion editeur
4:i - La commande d'insertion. Avec cette commande, vous pouvez saisir du texte qui commence à gauche du curseur.
5:I - La commande d'insertion au début. Avec cette commande, vous pouvez saisir du texte qui commence au début de la ligne actuelle.
6:o - Cette commande ouvre une ligne sous la ligne courante et vous met en mode insertion.
7:O - Cette commande ouvre une ligne au-dessus de la ligne courante et vous met en mode insertion.
Exemple 4 :
devinfo@ubuntu:~$ grep -B 2 insertion editeur
a - La commande ajouter. Avec cette commande, vous pouvez saisir du texte qui commence à droite du curseur.
A - La commande ajouter à la fin. Avec cette commande, vous pouvez saisir du texte en commençant à la fin de la ligne courante.
i - La commande d'insertion. Avec cette commande, vous pouvez saisir du texte qui commence à gauche du curseur.
I - La commande d'insertion au début. Avec cette commande, vous pouvez saisir du texte qui commence au début de la ligne actuelle.
o - Cette commande ouvre une ligne sous la ligne courante et vous met en mode insertion.
O - Cette commande ouvre une ligne au-dessus de la ligne courante et vous met en mode insertion.
egrep

La commande egrep est identique à grep, mais utilise un langage différent (« étendu ») pour les expressions régulières. C'est la même chose que grep -E.

egrep [options] motif [fichiers]

fgrep

fgrep [options] [liste_chaines] [fichiers]

La commande fgrep est identique à grep, mais au lieu d'accepter une expression régulière, elle accepte une liste de chaînes fixes, séparées par des retours à la ligne. C'est la même chose que grep -F.

egrep [options] motif [fichiers]

Par exemple, si vous avez un fichier dictionnaire plein de chaînes, une par ligne :

insertion
curseur
lettre

vous pouvez facilement rechercher ces chaînes dans un ensemble de fichiers d'entrée :

Exemple 6 :
devinfo@ubuntu:~$ fgrep -f dict editeur
Pour entrer en mode de saisie, tapez une lettre de commande de saisie. Pour commencer, tapez l'une des lettres suivantes. Lorsque vous avez terminé de saisir du texte, appuyez sur la touche Echap (parfois deux fois) pour revenir au mode commande.
a - La commande ajouter. Avec cette commande, vous pouvez saisir du texte qui commence à droite du curseur.
i - La commande d'insertion. Avec cette commande, vous pouvez saisir du texte qui commence à gauche du curseur.
I - La commande d'insertion au début. Avec cette commande, vous pouvez saisir du texte qui commence au début de la ligne actuelle.
o - Cette commande ouvre une ligne sous la ligne courante et vous met en mode insertion.
O - Cette commande ouvre une ligne au-dessus de la ligne courante et vous met en mode insertion.

fgrep est pratique lors de la recherche de caractères non alphanumériques comme * et { car ils sont traités littéralement, et non comme des caractères d'expression régulière.

Commande cut

cut -(b|c|f)intervalle [options] [fichiers]

Exemple 7 :

La commande cut extrait des colonnes de texte à partir de fichiers. Une « colonne » est définie par des décalages de caractères (par exemple, le dix-neuvième caractère de chaque ligne)

devinfo@ubuntu:~$ cut -c19 editeur
e
o
o
i
i
Exemple 8 :

ou par décalages d'octets (qui sont différents des caractères si votre langue comporte des caractères multi-octets) :

devinfo@ubuntu:~$ cut -b19 editeur
e
o
o
i
i
Exemple 9 :

ou par des champs délimités (par exemple, le quatrième champ de chaque ligne d'un fichier délimité par des virgules, etudiants) :

devinfo@ubuntu:~$ cat etudiants
1, mostafa, 33, Meknes, 18
2, ismail, 27, Rabat, 16
3, Sara, 25, Paris, 18
4, Alex, 38, Lyon, 15
devinfo@ubuntu:~$ cut -f4 -d, etudiants
 Meknes
 Rabat
 Paris
 Lyon
Exemple 10 :

Vous n'êtes pas limité à afficher une seule colonne : vous pouvez fournir une plage (2-5), une séquence séparée par des virgules (1,3,5) ou les deux (1,2,3-6). Pour les plages, si vous omettez le premier nombre (-6), un 1 est supposé (1-6); si vous omettez le dernier chiffre (3-), la fin de ligne est utilisée.

devinfo@ubuntu:~$ cut -f 1,3,5 -d, etudiants
1, 33, 18
2, 27, 16
3, 25, 18
4, 38, 15
devinfo@ubuntu:~$ cut -f 2-5 -d, etudiants
 mostafa, 33, Meknes, 18
 ismail, 27, Rabat, 16
 Sara, 25, Paris, 18
 Alex, 38, Lyon, 15
devinfo@ubuntu:~$ cut -f -6 -d, etudiants
1, mostafa, 33, Meknes, 18
2, ismail, 27, Rabat, 16
3, Sara, 25, Paris, 18
4, Alex, 38, Lyon, 15
devinfo@ubuntu:~$ cut -f 2- -d, etudiants
 mostafa, 33, Meknes, 18
 ismail, 27, Rabat, 16
 Sara, 25, Paris, 18
 Alex, 38, Lyon, 15

Commande paste

paste [options] [fichiers]

La commande paste (coller) est l'inverse de cut (couper) : elle traite plusieurs fichiers comme des colonnes verticales et les combine sur la sortie standard :

Exemple 11 :
devinfo@ubuntu:~$ cat codesville
1
2
3
4
5
devinfo@ubuntu:~$ cat nomville
Meknes
Paris
Rabat
Lyon
Lille
Marrakech
devinfo@ubuntu:~$ paste codesville nomville
1	Meknes
2	Paris
3	Rabat
4	Lyon
5	Lille
	Marrakech
devinfo@ubuntu:~$ paste nomville codesville
Meknes	1
Paris	2
Rabat	3
Lyon	4
Lille	5
Marrakech

Commande tr

tr [options] ensb1 [ensb2]

La commande tr effectue des traductions simples et utiles d'un ensemble de caractères dans un autre

Exemple 12 :

Par exemple, pour mettre en majuscule toutes les lettres d'un fichier.

devinfo@ubuntu:~$ cat nomville | tr 'a-z' 'A-Z'
MEKNES
PARIS
RABAT
LYON
LILLE
MARRAKECH
Exemple 13 :

ou pour changer toutes les voyelles en astérisques :

devinfo@ubuntu:~$ cat nomville | tr aeiouAEIOU '*'
M*kn*s
P*r*s
R*b*t
Ly*n
L*ll*
M*rr*k*ch
Exemple 14 :

ou pour supprimer toutes les voyelles :

devinfo@ubuntu:~$ cat nomville | tr -d aeiouAEIOU
Mkns
Prs
Rbt
Lyn
Lll
Mrrkch

tr traduit le premier caractère du jeu de caractères1 en le premier caractère du jeu de caractères2, le deuxième en deuxième, le troisième en troisième, et ainsi de suite. Si la longueur de ensb1 est N, seuls les N premiers caractères de ensb2 sont utilisés.

Les jeux de caractères peuvent avoir les formes suivantes :

  •  ABEF : La séquence de caractères A, B, E, F.
  •  A-Z : La plage des caractères de A à Z.
  •  [x*n] : n répétitions du caractère x.
  •  [:classe:] : Les mêmes classes de caractères ([:alnum:], [:digit:], etc.) acceptées par grep.
Options utiles
  •  -d : Supprimer les caractères de 'ensb1' de l'entrée.
  •  -s : Elimine les doublons adjacents (trouvés dans ensb1) de l'entrée. Par exemple, tr -s aeiouAEIOU serrerait les voyelles adjacentes en double pour être des voyelles simples (reeeeeeally deviendrait really).
  •  -c : Complément : opérer sur tous les caractères non trouvés dans ensb1.
  •  -t Si ensb1 est plus long que ensb2, faites-leur la même longueur en tronquant ensb1. Si -t n'est pas présent, le dernier caractère de ensb2 est (invisible) répété jusqu'à ce que ensb2 ait la même longueur que ensb1.

Commande sort

sort [options] [fichiers]

La commande sort affiche les lignes de texte dans l'ordre alphabétique, ou triées selon une autre règle que vous spécifiez. Tous les fichiers fournis sont concaténés, et le résultat est trié et affiché :

Exemple 15 :
devinfo@ubuntu:~$ cat nomville
Meknes
Paris
Rabat
Lyon
Lille
Marrakech
devinfo@ubuntu:~$ sort nomville
Lille
Lyon
Marrakech
Meknes
Paris
Rabat
Options utiles
  •  -f : Tri insensible à la casse.
  •  -n : Trier numériquement (par exemple, 9 vient avant 10) plutôt qu'alphabétiquement (10 vient avant 9 car il commence par un "1"). 
  •  -g : Une autre méthode de tri numérique avec un algorithme différent qui, entre autres, reconnaît la notation scientifique (7.4e3 signifie "7,4 fois dix puissance 3", ou 7400). 
  •  -u : Tri unique : ignorer les lignes en double. (Si utilisé avec -c pour vérifier les fichiers triés, échoue si des lignes consécutives sont identiques.)
  •  -c : Ne pas trier, juste vérifier si l'entrée est déjà triée. Si c'est le cas, n'affiche rien ; sinon, affiche un message d'erreur.
  •  -b : Ignore les espaces en tête de lignes.
  •  -r : Inverser la sortie : trier du plus grand au plus petit.
  •  -t X : Utiliser X comme délimiteur de champ pour l'option -k.
  •  -k cle : Choisir les clés de tri. (Combinez avec -t pour choisir un caractère séparateur entre les clés).

Un tri ordinaire afficherait la ligne "1, mostafa" en premier. Mais si vous considérez chaque ligne comme cinq valeurs séparées par des virgules, vous pouvez trier sur la deuxième valeur avec :

Exemple 16 :
devinfo@ubuntu:~$ sort etudiants
1, mostafa, 33, Meknes, 18
2, ismail, 27, Rabat, 16
3, Sara, 25, Paris, 18
4, Alex, 38, Lyon, 15
devinfo@ubuntu:~$ sort -k2 -t, etudiants
4, Alex, 38, Lyon, 15
2, ismail, 27, Rabat, 16
1, mostafa, 33, Meknes, 18
3, Sara, 25, Paris, 18

Partager ce cours avec tes amis :
Rédigé par ESSADDOUKI Mostafa
ESSADDOUKI
The education of the 21st century opens up opportunities to not merely teach, but to coach, mentor, nurture and inspire.