Traitement du texte

État : {a_reli}

Retour au document principal

Pré-requis

Objectifs

le couteau suisse cat

l'éditeur cat

La commande cat peut être utilisée comme un éditeur de texte rudimentaire.

Exemple :

cat  > petit-message
nous sommes curieux
de rencontrer
des pingouins à Prague
Crtl+D

Vous noterez l'utilisation de Ctrl+D. Cette commande est utilisée pour clore la saisie.

le lecteur cat

On utilise plus couramment cat pour envoyer du texte vers stdout.

Les options les plus courantes sont :

Exemple :

cat  /etc/resolv.conf
search    mydomain.org
nameserver   127.0.0.1

tac lit à l'envers

tac fait la même chose que cat à l'exception qu'elle lit de la dernière ligne à la première.

Exemple :

tac petit-message
des pingouins à Prague
de rencontrer
nous sommes curieux

Petits outils

Utilisation de head ou tail

On utilise souvent les commandes head et tail pour analyser les fichiers journaux. Par défaut, ces commandes affichent 10 lignes. En voici les utilisations les plus courantes :

Exemples :

tail a une option supplémentaire qui nous permet d'afficher la fin d'un texte en commençant par une ligne donnée.

Exercice :

Enfin, tail peut afficher un fichier en continu avec l'option -f. C'est extrêmement pratique pour suivre les modifications d'un fichier en temps réel.

Compter les lignes, les mots et les octets

La commande wc compte le nombre d'octets, de mots et de lignes dans les fichiers. Les options suivantes vous permettent de sélectionner ce qui vous intéresse :

Options de wc

-l

compte le nombre de lignes

-w

compte le nombre de mots (words)

-c

compte le nombre d'octets

-m

compte le nombre de caractères

NdT : les options -c et -m me rendent perplexe, mais il n'y a rien à y faire, juste à les connaître...

Remarque : sans argument, wc compte ce qui est saisi dans stdin.

Numérotation des lignes

La commande nl affiche la même chose que cat -b.

Exemples :

Remplacer les tabulations par des espaces

On utilise la commande expand pour remplacer les tabulations par des espaces. unexpand est utilisé pour l'opération inverse.

Afficher les fichiers binaires

Il y a nombre d'outils pour ça. Les plus courants sont od (octal dump) et hexdump.

Découper les fichiers

La commande split peut découper un fichier en plusieurs fichiers plus petits à partir de critères comme la taille ou le nombre de lignes. Par exmple, nous pouvons découper /etc/passwd en fichiers de 5 lignes chacuns :

split -l 5 /etc/passwd

Cette commande va créer des fichiers appelés xaa, xab, xac, xad, etc., chaque fichier contenant au plus 5 lignes. Il est possible de donner un préfixe plus significatif que "x", comme "pass-5" :

split -l 5 /etc/passwd passwd-5

Cette commande crée des fichiers identiques à la commande précédente, mais ils sont désormais nommés passwd-5aa, passwd-5ab, passwd-5ac, passwd-5ad, ...

Éliminer les lignes successives en doublon

La commande uniq n'envoie à STDOUT qu'une version des lignes successives identiques.

Exemple :

uniq > /tmp/UNIQUE
ligne 1
ligne 2
ligne 2
ligne 3
ligne 3
ligne 3
ligne 1
^D

Le fichier /tmp/UNIQUE a le contenu suivant :

cat /tmp/UNIQUE
ligne 1
ligne 2
ligne 3
ligne 1

/!\ Remarque : Nous pouvons voir dans l'exemple précédent qu'en utilisant "uniq", les lignes en doublon qui ne se suivent pas sont envoyées à STDOUT.

Quel est le contenu de /tmp/UNIQUE si nous envoyons d'abord STDIN à sort (voir '''sort''' un peu plus loin) comme ici :

sort | uniq > /tmp/UNIQUE

Manipulations du texte

Les outils suivants modifient la mise en page du texte.

Sélectionner les champs et les caractères avec cut

La commande cut peut extraire une plage de caractères ou de champs de chaque ligne d'un texte.

L'option -c est utilisée pour manipuler les caractères.

Syntaxe :

cut –c {plage1,plage2}

Exemple :

cut -c5-10,15- /etc/passwd

La commande précédente extrait les caractères 5 à 10 puis 15 jusqu'à la fin pour chaque ligne de /etc/passwd.

On peut spécifier le séparateur de champ (espace, virgule, etc.) d'un fichier ainsi que les champs à extraire. Ces options sont définies respectivement par les options -d (delimiter) et -f (field).

Syntaxe :

cut -d {séparateur}  -f {champs}

Exemple :

cut -d: -f 1,7 --output-delimiter=" " /etc/passwd

Cette commande extrait les 1er et 7e champs de /etc/passwd séparés par un espace. Le délimiteur de sortie est le même que le délimiteur d'entrée d'origine (NdT : par défaut, c'est la tabulation). L'option --output-delimiter vous permet de le changer.

Jointure de texte

La commande la plus facile est paste qui concatène deux fichiers l'un à la suite de l'autre.

Syntaxe :

paste   texte1   texte2

Avec join vous pouvez en plus préciser quels champs vous souhaitez.

Syntaxe :

join  -j1 {champ_no}  -j2{champ_no}  texte1  texte2               ou
join   -1 {champ_no}  -2{champ_no}  texte1  texte2 

Le texte n'est envoyé à la sortie que si les champs sélectionnés correspondent.

/!\ Les comparaisons se font ligne par ligne et le processus s'arrête dès qu'il n'y a pas de correspondance, même s'il y a d'autres correspondances à la fin du fichier.

Trier la sortie

Par défaut, sort trie le texte par ordre alphabétique. Pour effectuer un tri numérique, utilisez l'option -n.

Mise en forme de la sortie avec fmt et pr

Vous pouvez modifier le nombre de caractères par ligne avec fmt. Par défaut fmt joins les ligne et génère des lignes de 75 caractères.

Options de fmt

-w

(width) nombre de caractères par ligne

-s

découpe les lignes longues mais sans les remplir

-u

sépare chaque mot par une espace et chaque phrase par deux espaces

On peut paginer les longs fichiers pour qu'ils correspondent à une taille donnée avec la commande pr. On peut contrôler la longueur des pages (66 lignes par défaut), la largeur (par défaut 72 caractères) ainsi que le nombre de colonnes.

Lorsqu'on produit un texte sur plusieurs colonnes, chaque colonne est tronquée uniformément en fonction de la largeur de page spécifiée. Cela veut dire que des caractères sont supprimés à moins d'avoir édité le texte de façon à éviter cela.

Convertir les caractères

La commande tr convertit un ensemble de caractères en un autre.

Exemple :

/!\ Remarque : tr a seulement deux arguments ! Le fichier n'est pas un argument.

Résumé et exercices

Questions de révision

Oui ou Non

  1. Les commandes "cat FICHIER" et "cat < FICHIER" affichent toutes les deux le contenu de FICHIER : _

  2. La commande "last FICHIER" affiche les 10 dernières lignes de FICHIER : _

  3. Lorsque vous modifiez les lignes d'un fichier en utilisant cut, ces modifications ne sont effctives que pour STDOUT : _

  4. Lorsqu'on utilise uniq sur un fichier, les lignes en doublon successives sont éliminées dans le fichier : _

Voir les réponses

Commandes

Commande

Description (apropos)

cat

cat (1) - Concaténer des fichiers et les afficher sur la sortie standard

cut

cut (1) - Supprimer une partie de chaque ligne d'un fichier

expand

expand (1) - Convertir les tabulations en espaces

fmt

fmt (1) - Formater simplement du texte

head

head (1) - Afficher le début des fichiers

join

join(1) – Fusionner les lignes de deux fichiers ayant des champs communs

nl

nl(1) – Numéroter les lignes d'un fichier

od

od(1) – Afficher le contenu d'un fichier en octal ou sous d'autres formats

paste

paste(1) – Regrouper les lignes de différents fichiers

sort

sort(1) – Trier les lignes de fichiers texte

split

split(1) – Découper un fichier en différentes parties

tac

tac(1) – Concaténer et afficher des fichiers à l'envers

tail

tail(1) – Afficher la dernière partie de fichiers

tr

tr(1) – Convertir ou éliminer des caractères

unexpand

unexpand(1) – Convertir les espaces en tabulations

uniq

uniq(1) – Signaler ou éliminer les lignes répétées

wc

wc(1) – Afficher le nombre de lignes, de mots et d'octets d'un fichier

Travaux pratiques

  1. À l'aide de cat, saisissez le texte suivant dans le fichier message :

    cat >> message 
    ligne 1
    ^D  
    • Faites la même chose mais utilisez le mot clé STOP à la place du contrôle de fin de fichier (^D)
    cat >> message << STOP
    ligne 2
    STOP
    • Ensuite, ajoutez le texte suivant avec la commande echo :

    echo ligne 3 >> message
  2. Créez le fichier index avec deux champs REFERENCE et TITRE séparés par un espace :

    001 Utiliser_Linux
    • Créez un second fichier tarifs avec deux champs REFERENCE et PRIX séparés par un espace :

    001 9.99
    • Utilisez join pour afficher les champs REFERENCE, TITRE et PRIX

  3. À l'aide de tr, remplacez toutes les virgules par des points-virgules dans /etc/passwd

    • Faites la même chose avec cut

  4. Affichez les lignes 70 à 85 de /var/log/messages en utilisant head et tail.

  5. Utilisez les commandes cut, grep et ifconfig pour n'afficher que l'adresse IP de la première interface réseau eth0.

  6. Créez le répertoire /tmp/fichiers

    mkdir /tmp/fichiers
    • Créez 50 fichiers dans ce répertoire :
    count=0
    while [ $compte -lt 50 ]; do
    touch /tmp/fichiers/$compte.txt
    let compte+=1
    done
    • Nous souhaitons changez les extensions txt en dat. Pour ce faire, nous devons taper les commandes suivantes :
    for FICHIER in $(ls *.txt) 
    do
    NOM_FICHIER=$(echo $FICHIER| cut -d. -f1)
    mv  $FICHIER $NOM_FICHIER.dat
    done

Réponses aux questions

  1. oui

  2. non : il faut utiliser tail

  3. oui : c'est le cas avec toutes les commandes de traitement de texte

  4. non : toutes les commandes de traitement de texte modifient les données vers STDOUT et ne modifient pas le fichier original

Page consultée 72 fois