
Nous voyons que la syntaxe dans le cas de critères de recherches est assez lourde.
|
| Caractére spécial | Signification |
| + | Répétition, le caractère placé devant doit apparaetre au moins une fois. |
| ? | Le caractère situé devant doit apparaetre une fois ou pas du tout. |
| | | Ou logique, l'expression située avant ou aprés doit apparaitre |
| (...) | groupage de caractères |
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 la 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).
La commande cut permet de sélectionner des colonnes et des champs (découpage vertical) dans un fichier.
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, (ex -c2 pour la colonne 2) * une plage (ex -c2-4 pour les colonnes 2, 3 et 4) * une liste de colonnes (ex -c1,3,6 pour les colonnes 1, 3 et 6) * les trois en meme temps (ex -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 |
La commande cut permet aussi de sélectionner des champs. Ces champs doivent etre 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 souris 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 |
La commande wc (word count) 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.
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 | Role |
| -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. |
|
$ 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.
Autres exemples avec un fichier appelé "prenoms.txt" et comprenant les prénoms suivants:
François
Marcel
Albert
Jean
Stéphane
patrice
Vincent
jonathan
Ensuite, exécutez la commande sort sur ce fichier :
$ sort prenoms.txt
Albert
François
Jean
jonathan
Marcel
patrice
Stéphane
Vincent
Le contenu du fichier est trié alphabétiquement et le résultat est affiché dans la console.
Vous noterez que sort ne fait pas attention à la casse (majuscules / minuscules).
L'option -r permet d'inverser le tri :
$ sort -r noms.txt
Vincent
Stéphane
patrice
Marcel
jonathan
Jean
François
Albert
La commande join permet d'effectuer une jointure de deux fichiers en fonction d'un champ commun. les deux fichiers doivent etre triés sur les champs indiqués. La numérotation des champs démarre à 0.
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.
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 chaine 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 |
Rien n'empeche 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.
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
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'etre 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.
Dans certains cas, comme par exemple la génération de fichiers traces, il peut etre nécessaire de devoir à la fois placer dans un fichier le résultat d'une commande et de filtrer ce meme 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
Les deux commandes permettant de comparer le contenu de deux fichiers, ou d'un fichier et un flux sont les commandes diff et cmp.
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), et 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,8veut 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 etre 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 etre é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 etre é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 etre supprimées car elles n'existent pas apres la ligne 12 de liste2.
La commande cmp compare les fichiers caractère par caractère. Par défaut la commande s'arrete des 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
...
Ici sont regroupés quelques outils intéressants non abordés auparavant.
* 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 meme 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 meme 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 connaetre 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). Ex : find . -print | cpio -ocv > archive.cpio.
# 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.
# 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.
# w : statistiques sur le systéme : affiche une entéte comme uptime puis la liste des utilisateurs connectés.
uniq vise à supprimer les doublons
Par exemple, pour un fichier trié, la commande uniq ne repère que les lignes successives qui sont identiques.
Albert
François
François
François
Jean
jonathan
Marcel
Marcel
patrice
Stéphane
Vincent
On peut traiter ce fichier avec uniq pour éliminer les noms en double (et même en triple) dans ce fichier
$ uniq prénoms.txt
Albert
François
Jean
jonathan
Marcel
patrice
Stéphane
Vincent
La liste de noms sans les doublons s'affiche alors dans la console ! :)
L'option -c permet de compter le nombre d'occurences
L'option -d permet d'afficher uniquement les lignes présentes en double