Chapitre 8 : Les filtres et utilitaires
Introduction
Rappel : un filtre (ou une commande filtre) est un programme sachant écrire et lire des données par les canaux standards d’entrée et de sortie. Il en modifie ou traite éventuellement le contenu. la commande wc est un filtre. Les utilitaires sans être obligatoirement des filtres permettent un certain nombre d’actions sur des fichiers ou leur contenu comme le formatage ou l’impression.
Recherche de lignes
Il s’agit d’extraire des lignes d’un fichier selon divers critères. Pour cela on dispose de trois commandes grep , egrep et fgrep qui lisent les données soit depuis un fichier d’entrée, soit depuis le canal d’entrée standard.
grep
La syntaxe de la commande grep est :
grep [Options] modèle [Fichier1...]
Le modèle se compose de critères de recherche ressemblant beaucoup aux critères déjà exposés pour VI par exemple. Il ne faut pas oublier que ces critères doivent être interprétés par la commande grep et pas par le shell. Il faut donc verrouiller tous les caractères.
$ cat fic4
Cochon
Veau
Boeuf
rat
Rat
boeuf
$ grep \^[\b\B\] fic4
Boeuf
boeuf
La commande grep peut aussi prendre quelques options intéressantes.
-veffectue la recherche inverse : toutes les lignes ne correspondant pas aux critères sont affichées-cne retourne que le nombre de lignes trouvées sans les afficher-ine diférencie pas les majuscules et les minuscules-nindique le numéro de ligne pour chaque ligne trouvée-ldans le cas de fichiers multiples, indique dans quel fichier la ligne a été trouvée.
$ grep -i \^\[\b\] fic4
Boeuf
boeuf
Nous voyons que la syntaxe dans le cas de critères de recherches est assez lourde.
egrep
La commande egrep étend les critères de recherche et peut accepter un fichier de critères en entrée. Attention cependant egrep est lent et consomme beaucoup de ressources.
egrep -f fichier_critère Fichier_recherche
| Caractère spécial | Signification |
|---|---|
+ |
Répétition, le caractère placé devant doit apparaître au moins une fois. |
? |
Le caractère situé devant doit apparaître une fois ou pas du tout. |
| |
Ou logique, l’expression située avant ou après doit apparaître |
(...) |
groupage de caractères |
bon(jour|soir) sortira bonjour et bonsoir.
fgrep
La commande fgrep est un grep simplifié et rapide (fast grep). Elle accepte aussi un fichier de critères de recherche mais il s’agit là de critères simples, sans caractères spéciaux. On saisira dans le fichier de critère un critère simple (du texte et des chiffres) par ligne.
Colonnes et champs
La commande cut permet de sélectionner des colonnes et des champs (découpage vertical) dans un fichier.
Colonnes
La syntaxe est la suivante :
cut -cColonnes [fic1...]
Le format de sélection de colonne est le suivant :
- La numérotation des colonnes démarre à 1.
- une colonne seule, (exemple
-c2pour la colonne 2) - une plage (exemple
-c2-4pour les colonnes 2, 3 et 4) - une liste de colonnes (exemple
-c1,3,6pour les colonnes 1, 3 et 6) - les trois en même temps (exemple
-c1-3,5,6,12-)
$ cat liste
Produit prix quantites
souris 30 15
disque 100 30
ecran 300 20
clavier 45 30
$ cut -c1-5 liste
Produ
souri
disqu
ecran
clavi
$ cut -c1-3,10-12,15
Prorx quantites
sou0 15
dis0 30
ecr0 20
cla530
Champs
La commande cut permet aussi de sélectionner des champs. Ces champs doivent être par défaut délimités par une tabulation, mais l’option -d permet de sélectionner un autre caractère (espace, ; …). La sélection des champs est identique à celle des colonnes. Leur numérotation démarre à 1.
cut -dc -fChamps [fic1...]
$ cat liste
Produit prix quantites
souris 30 15
dur 100 30
disque 100 30
ecran 300 20
clavier 45 30
carte 45 30
$ cut -f1 liste
Produit
ouris
dur
disque
ecran
clavier
carte
$ cut -f1,3 liste
Produit quantites
souris 15
dur 30
disque 30
ecran 20
clavier 30
carte 30
$ cat /etc/group
system:*:0:root,ftp,sa_sgd,arret,ptrladm,ptrlagt
daemon:*:1:daemon
uucp:*:2:uucp
kmem:*:3:root,ingres
mem:*:3:root,ingres
bin:*:4:bin,adm
sec:*:5:
mail:*:6:mail
terminal:*:7:
tty:*:7:root
news:*:8:uucp
$ cut -d: -f1,3
system:0
daemon:1
uucp:2
kmem:3
mem:3
bin:4
sec:5
mail:6
terminal:7
tty:7
news:8
Compter les lignes
La commande wc (wordcount) permet de compter les lignes, mots et caractères.
wc [-l] [-c] [-w] [-w] fic1
-l: compte le nombre de lignes-c: compte le nombre d’octets-w: compte le nombre de mots[-m: compte le nombre de caractères]. Cette option n’est pas proposée partout.
$ wc liste
12 48 234 liste
Le fichier liste contient 12 lignes, 48 mots et 234 caractères.
Tri de lignes
La commande sort permet de trier des lignes. Par défaut le tri s’effectue sur tout le tableau et en ordre croissant. Le tri est possible sur un ou plusieurs champs. Le séparateur de champs par défaut est la tabulation ou au moins un espace. S’il y a plusieurs espaces, le premier est le séparateur, les autres des caractères du champ. La numérotation des champs démarre à 0.
sort [options] [+pos1 [-pos2] ...] [fic1...]
+pos1 est le premier champ, -pos2 le dernier.
$ cat liste
Produit objet prix quantites
souris optique 30 15
dur 30giga 100 30
dur 70giga 150 30
disque zip 12 30
disque souple 10 30
ecran 15 150 20
ecran 17 300 20
ecran 19 500 20
clavier 105 45 30
clavier 115 55 30
carte son 45 30
carte video 145 30
$ sort +0 liste
Produit objet prix quantites
carte son 45 30
carte video 145 30
clavier 105 45 30
clavier 115 55 30
disque souple 10 30
disque zip 12 30
dur 30giga 100 30
dur 70giga 150 30
ecran 15 150 20
ecran 17 300 20
ecran 19 500 20
souris optique 30 15
Quelques options
| Option | Rôle |
|---|---|
-d |
Dictionnary sort (tri dictionnaire). Ne prend comme critère de tri que les lettres les chiffres et les espaces. |
-n |
Tri numérique, idéal pour le colonnes de chiffres |
-b |
Ignore les espaces en début de champ |
-f |
Pas de différences entre majuscules et minuscules (conversion en minuscules puis tri) |
-r |
Reverse, tri en ordre décroissant. |
-tc |
Nouveau délimiteur de champ c. |
Exemple, tri numérique sur le prix par produits et quantités en ordre décroissant.
$ sort -n -r +2 -3 liste
ecran 19 500 20
ecran 17 300 20
ecran 15 150 20
dur 70giga 150 30
carte video 145 30
dur 30giga 100 30
clavier 115 55 30
clavier 105 45 30
carte son 45 30
souris optique 30 15
disque zip 12 30
disque souple 10 30
Produit objet prix quantites
Il est aussi possible de démarrer le tri à partir d’un certain caractère d’un champ. Pour cela on spécifie le « .pos » : +0.3 commencera le tri à partir du quatrième caractère du champ 0.
Joindre deux fichiers
La commande join permet d’effectuer une jointure de deux fichiers en fonction d’un champ commun. les deux fichiers doivent être triés sur les champs indiqués. La numérotation des champs commence à 1.
join [-tc] [-j1 n] [-j2 n2] fic1 fic2
join [-tc] [-1 n] [-2 n2] fic1 fic2
L’option -t indique le séparateur, -j1 (-1) le champ du premier fichier et -j2 (-2) le champ du second fichier. Par exemple :
$ join -t: -j1 4 -j2 3 /tmp/seb/passwd /tmp/seb/group
va joindre passwd et group en fonction de leur champ commun GID.
Remplacement de caractères
La commande tr permet de substituer des caractères à d’autres et n’accepte que des données depuis le canal d’entrée standard, ou par des fichiers en redirection d’entrée.
tr [options] original destination
L’original et la destination représentent un ou plusieurs caractères. Les caractères originaux sont remplacés par les caractères de destination dans l’ordre indiqué. Les crochets permettent de définir des plages.
Par exemple, remplacer le o par le e et le i par le a.
$ cat liste | tr "oi" "ea"
Preduat ebjet prax quantates
seuras eptaque 30 15
dur 30gaga 100 30
dur 70gaga 150 30
dasque zap 12 30
dasque seuple 10 30
ecran 15 150 20
ecran 17 300 20
ecran 19 500 20
clavaer 105 45 30
clavaer 115 55 30
carte sen 45 30
carte vadee 145 30
Avec cette commande on peut convertir une chaîne en majuscules ou en minuscules, passage de toutes les minuscules en majuscules :
$ cat liste | tr "[a-z]" "[A-Z]"
PRODUIT OBJET PRIX QUANTITES
SOURIS OPTIQUE 30 15
DUR 30GIGA 100 30
DUR 70GIGA 150 30
DISQUE ZIP 12 30
DISQUE SOUPLE 10 30
ECRAN 15 150 20
ECRAN 17 300 20
ECRAN 19 500 20
CLAVIER 105 45 30
CLAVIER 115 55 30
CARTE SON 45 30
CARTE VIDEO 145 30
Visualiser du texte
Rien n’empêche de détourner un quelconque flux pour l’afficher sur écran ou imprimante. Voici quelques commandes.
- Page par page : pg , more , less
- en bloc : cat
- création d’une bannière : banner
- formatage pour impression : pr
On aura plus d’informations avec la commande man.
Début d’un fichier
Pour voir le début d’un fichier on utilise la commande head.
head [-c nbcar] [-n nblignes] [fic1...]
L’option -c n’est pas disponible sous tous les Unix et permet de préciser un nombre d’octets d’en-tête à afficher. Par défaut 10 lignes sont affichées. L’option -n permet d’indiquer le nombre de lignes à afficher. Sur certains Unix c’est la syntaxe suivante qu’il faudra utiliser.
head [-nblignes] [fic1...]
$ head -n 3 liste
Produit objet prix quantites
souris optique 30 15
dur 30giga 100 30
Fin et attente de fichier
Pour voir les dernières lignes d’un fichier, on utilise la commande tail.
tail [+/-valeur[b/c]] [-f] [fic1...]
Comme pour head, par défaut les dix dernières lignes sont affichées. La valeur -nblignes permet de modifier cet état. Préciser c indique un nombre de caractères. Un b indique un nombre de blocs (512 octets par bloc).
Un + inverse l’ordre de la commande, et devient un head (tail +10 <=> head -n 10).
Enfin l’option -f laisse le fichier ouvert. Ainsi si le fichier continue d’être rempli (par exemple un fichier trace), son contenu s’affichera en continu sur l’écran jusqu’à interruption volontaire de l’utilisateur (ctrl+C).
$ tail -5 liste
ecran 19 500 20
clavier 105 45 30
clavier 115 55 30
carte son 45 30
carte video 145 30
$ tail -10c liste
eo 145 30
Nous aurons l’occasion de voir l’effet de la commande tail -f plus tard lors de la programmation shell.
Dupliquer le canal de sortie standard
Dans certains cas, comme par exemple la génération de fichiers traces, il peut être nécessaire de devoir à la fois placer dans un fichier le résultat d’une commande et de filtrer ce même résultat avec une autre commande. On utilise pour cela la commande tee qui permet de dupliquer le flux de données. Elle lit le flux de données provenant d’une autre commande par le canal d’entrée, l’écrit dans un fichier et restitue ce flux à l’identique par le canal de sortie. Par défaut le fichier généré écrase l’ancien s’il existe.
tee [-a] nom_fic
L’option -a signifie append. Dans ce cas le fichier n’est pas écrasé mais complété à la fin. Par exemple, on veut obtenir à la fois dans un fichier la liste des noms d’utilisateurs et afficher leur nombre sur écran.
$ cat /etc/passwd | cut -d: -f1 | tee users | wc -l
65
$ cat users
root
nobody
nobodyV
daemon
bin
uucp
uucpa
auth
cron
lp
tcb
...
Comparaisons de fichiers
Les deux commandes permettant de comparer le contenu de deux fichiers, ou d’un fichier et un flux sont les commandes diff et cmp.
diff
La commande diff indique les modifications à apporter aux deux fichiers en entrée pour que leur contenu soit identique.
diff [-b] [-e] fic1 fic2
- L’option
-bpermet d’ignorer les espaces (blank) - l’option
-epermet de générer un script ed (nous ne l’utiliserons pas). Cette commande renvoie trois types de messages :- APPEND : ligne1 a ligne3,ligne4, ex 5 a 6,8 veut dire : à la ligne 5 de fic1 il faut raccrocher les lignes 6 à 8 de fic2 pour que leurs contenus soient identiques.
- DELETE : ligne1,ligne2 d ligne3, ex 7,9 d 6 veut dire : les lignes 7 à 9 de fic1 doivent être supprimées, elles n’existent pas derrière la ligne 6 de fic2.
- CHANGE : ligne1,ligne2 c ligne3,ligne4, ex 8,12 c 9,13 veut dire : les lignes 8 à 12 de fic1 doivent être échangées contre les lignes 9 à 13 de fic2.
Dans tous les cas, le signe < indique les lignes de fic1 concernées, et le signe > les lignes de fic2 concernées.
$ cat liste
Produit objet prix quantites
souris optique 30 15
dur 30giga 100 30
dur 70giga 150 30
disque zip 12 30
disque souple 10 30
ecran 15 150 20
ecran 17 300 20
ecran 19 500 20
clavier 105 45 30
clavier 115 55 30
carte son 45 30
carte video 145 30
$ cat liste2
Produit objet prix quantites
souris boutons 30 15
dur 30giga 100 30
dur 70giga 150 30
disque zip 12 30
disque souple 10 30
ecran 15 150 20
ecran 17 300 20
ecran 19 500 20
ecran 21 500 20
clavier 105 45 30
clavier 115 55 30
Le fichier liste est l’original. Dans liste2, la deuxième ligne a été modifiée, une ligne écran à été ajoutée et les deux dernières lignes ont été supprimées.
$ diff liste liste2
2c2
< souris optique 30 15
---
> souris boutons 30 15
9a10
> ecran 21 500 20
12,13d12
< carte son 45 30
< carte video 145 30
2c2: les lignes 2 de liste et liste2 doivent être échangées (elles doivent concorder soit en optique, soit en boutons)9a10: après la ligne 9 de liste (écran 19) il faut ajouter la ligne 10 (écran 21) de liste212,13d12: les lignes 12 et 13 de liste (carte son et vidéo) doivent être supprimés car elles n’existent pas après la ligne 12 de liste2.
cmp
La commande cmp compare les fichiers caractère par caractère. Par défaut la commande s’arrête dès la première différence rencontrée et indique la position de l’erreur.
cmp [-l] [-s] fic1 fic2
- L’option
-ldétaille toutes les différences en trois colonnes. La première colonne représente le numéro de caractère, la deuxième la valeur octale ASCII du caractère concerné de fic1 et et troisième la valeur octale ASCII du caractère concerné de fic2. - L’option
-sretourne uniquement le code d’erreur (non visible), nous verrons plus tard comment l’exploiter.
$ cmp liste liste2
liste liste2 differ: char 38, line 2
$ cmp -l liste liste2
38 157 142
39 160 157
40 164 165
41 151 164
42 161 157
43 165 156
44 145 163
182 143 145
183 154 143
...
Outils divers
Ici sont regroupés quelques outils intéressants non abordés auparavant.
Archivage et compression
- compress [-c] [-d] [-f], uncompress [-c] et zcat : permettent de compresser, décompresser et afficher un fichier compressé au format d’encodage Lempel-Ziv. Cette méthode est moins performante que la suivante. Avec l’option
-cle résultat (compressé ou décompressé) est envoyé par le canal de sortie standard. L’option-ddécompresse le fichier, l’option-fforce la compression même si la taille du fichier ne varie pas. L’extension par défaut du fichier est «.Z». - gzip [-c] [-d] [-f] [-1->9] [-r] et gunzip : version GNU améliorée de compress et uncompress. La méthode utilisée est la même mais améliorée. Les options
-cet-dsont identiques. L’option-févite la demande de confirmation avant écrasement des fichiers, les options de -1 (fast) à -9 (best) déterminent le taux de compression. L’option-rindique la récursivité. L’extension par défaut est « .gz ». - tar [-c] [-x] [-t] [-v] [-f] : manipulation d’archives cassette, par extension archivage par concaténation d’une série de fichiers compressés ou non. L’option
-cpermet la création de l’archive,-xl’extraction,-tliste le contenu de l’archive,-vinhibe le mode silence,-fpermet de préciser le nom de l’archive. Par défaut la commande tar est récursive. L’extension par défaut est « .tar ». La version Gnu de tar propose l’option-zqui compresse l’archive tar avec gzip. Ex : tar cvf archive.tar /home/toto ; gzip archve.tar. - cpio [-o] [-i] [-p] [-t] [-v] [-d] [-B] [-c]: copie de fichiers depuis et vers une archive. On a tendance aujourd’hui à utiliser tar car la syntaxe de cpio est un peu plus complexe. Cependant il est utile de la connaître car beaucoup de sauvegardes fonctionnent de cette manière. Les options sont -o (output)
-i(input)-p(porting)-B(travailler avec des blocs de 5120 octets au lieu de 512)-c(créé une entête ASCII)-t(créé une table des matières)-v(affiche les noms des fichiers)-d(force la création de l’arborescence lors de la copie). Exemple : find . -print | cpio -ocv > archive.cpio.
Espace disque et memoire
- df [-k] [-F/t type]: affiche des statistiques sur l’utilisation de l’espace disque. L’option -k permet d’indiquer les valeurs en kilooctets au lieu de blocs de 512 octets,
-F(ou-tsuivant l’Unix) en fonction du type de filesystem. - du [-a] [-k] [chemin]: informations sur l’utilisation du filesystem, mais par répertoire et fichiers. L’option
-kforce l’affichage en kilo-octets, et-apour tous les fichiers et pas seulement pour le chemin. - free : sur certains Unix, donne des statistiques sur l’occupation de la mémoire physique et la mémoire virtuelle.
- vmstat : donne des informations sur la mémoire virtuelle et physique. Les informations sont complètes mais difficiles à lire.
Informations diverses
- uptime : donne des informations sur l’état actuel du système comme l’heure courante, le temps depuis le dernier démarrage, le nombre d’utilisateurs actuellement connectés, et la charge de la machine.
- uname [-a] [-m] [-r] [-s] [-v]: informations sur la version du système, -m le type de matériel -r le numéro de version du système, -s le type de système (os), -v la version de l’os et -a toutes les informations. Sur certains Unix -p donne le type de processeur.
- u : statistiques sur le système : affiche une entête comme uptime puis la liste des utilisateurs connectés.
Photo de Jakob Owens sur Unsplash