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.

  • -v effectue la recherche inverse : toutes les lignes ne correspondant pas aux critères sont affichées
  • -c ne retourne que le nombre de lignes trouvées sans les afficher
  • -i ne diférencie pas les majuscules et les minuscules
  • -n indique le numéro de ligne pour chaque ligne trouvée
  • -l dans 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 -c2 pour la colonne 2)
  • une plage (exemple -c2-4 pour les colonnes 2, 3 et 4)
  • une liste de colonnes (exemple -c1,3,6 pour 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 -b permet d’ignorer les espaces (blank)
  • l’option -e permet de générer un script ed (nous ne l’utiliserons pas). Cette commande renvoie trois types de messages :
    1. 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.
    2. 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.
    3. 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 liste2
  • 12,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 -l dé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 -s retourne 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 -c le résultat (compressé ou décompressé) est envoyé par le canal de sortie standard. L’option -d décompresse le fichier, l’option -f force 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 -c et -d sont 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 -r indique 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 -c permet la création de l’archive, -x l’extraction, -t liste le contenu de l’archive, -v inhibe le mode silence, -f permet 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 -z qui 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 -t suivant 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 -k force l’affichage en kilo-octets, et -a pour 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