Traitement du texte
État :
Sommaire
Pré-requis
Objectifs
- Manipuler efficacement les fichiers et les flux de données pour le contenu comme souhaité (c'est à dire en triant ou en formatant le contenu)
- Améliorer vos compétences dans l'utilisation de la ligne de commande en mémorisant et en comprenant de simples outils de manipulation des textes
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 :
- -n numéroter chaque ligne de la sortie
- -b numéroter uniquement les lignes non vides
- -A afficher le retour charriot
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 :
afficher les 20 première lignes de /var/log/messages :
head -n 20 /var/log/messages head -20 /var/log/messages
- afficher les 20 dernières lignes de /etc/aliases
tail -20 /etc/aliases
tail a une option supplémentaire qui nous permet d'afficher la fin d'un texte en commençant par une ligne donnée.
- afficher le texte en partant de la ligne 25 de /var/log/messages
tail +25 /etc/log/messages
Exercice :
Pour un texte de 90 lignes, comment utiliseriez-vous tail et head pour afficher les lignes 50 à 65 ? Y-a-t'il une seule façon de s'y prendre ?
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 :
- numéroter toutes les lignes y compris les lignes vides :
nl -ba /etc/lilo.conf
- numéroter uniquement les lignes avec du texte :
nl -bt /etc/lilo.conf
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 :
- convertir les majuscules en minuscules
tr 'A-B' 'a-b' < fichier.txt
- changer de délimiteur dans /etc/passwd
tr ':' ' ' < /etc/passwd
Remarque : tr a seulement deux arguments ! Le fichier n'est pas un argument.
Résumé et exercices
Questions de révision
Oui ou Non
Les commandes "cat FICHIER" et "cat < FICHIER" affichent toutes les deux le contenu de FICHIER : _
La commande "last FICHIER" affiche les 10 dernières lignes de FICHIER : _
Lorsque vous modifiez les lignes d'un fichier en utilisant cut, ces modifications ne sont effctives que pour STDOUT : _
Lorsqu'on utilise uniq sur un fichier, les lignes en doublon successives sont éliminées dans le fichier : _
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
À 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
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
À l'aide de tr, remplacez toutes les virgules par des points-virgules dans /etc/passwd
Faites la même chose avec cut
Affichez les lignes 70 à 85 de /var/log/messages en utilisant head et tail.
Utilisez les commandes cut, grep et ifconfig pour n'afficher que l'adresse IP de la première interface réseau eth0.
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
oui
non : il faut utiliser tail
oui : c'est le cas avec toutes les commandes de traitement de texte
non : toutes les commandes de traitement de texte modifient les données vers STDOUT et ne modifient pas le fichier original
Page consultée 467 fois