Nous proposons dans cette partie un bref panoramma des commandes de gestion des fichiers au format texte, format retenu par Unix car universel[7] . Un détour par la documentation (man) permettra de compléter utiliement ces connaissances.
Cette commande [word count]
permet de comptabiliser le nombre d'octets, de mots et de lignes du
fichier qui lui est passé en argument. Dans l'exemple ci-dessous, je
donne le nombre de lignes du fichier /etc/group.
EXEMPLE :
$ wc -l /etc/group # nombre de ligne uniquement, ici
45 /etc/group
En utilisant la commande
ps -axcw -o ppid,pid,user,vsz,time,command., créez le fichier~/elementBase/part2/processcontenant des informations sur les processus en cours.En utilisant la commande
ps -aux., créez le fichier~/elementBase/part2/ps-auxcontenant des informations sur les processus en cours.Combien de lignes contiennent les fichiers ?
Cette commande affiche la partie finale (par défaut, les 10
dernières lignes) du fichier qui lui est passé en argument. Dans
l'exemple qui suit, on utilise une propriété intéressante, l'option
-f qui permet d'afficher en permanence la fin d'un
fichier donné. On peut donc logger en temps réel
ce qui arrive dans le fichier /var/log/message
(si l'on possède les droits de lecture sur ce fichier). Pour en sortir
faire un <CTRL>-C.
EXEMPLE :
$ tail -f /var/log/messages
Aug 5 16:01:44 Godel /kernel: Connection attempt to UDP 127.0.0.1:512 from 127.
Aug 5 16:17:10 Godel /kernel: Connection attempt to UDP 192.168.200.2:2428 from
Aug 5 16:17:10 Godel su: BAD SU pascal to toor on /dev/ttyp5
Aug 5 16:32:35 Godel su: pascal to toor on /dev/ttyp5
Aug 5 16:48:01 /kernel: pid 33004 (sysinstall), uid 666: exited on signal 11 (c
Aug 5 17:03:28 Godel /kernel: Connection attempt to UDP 192.168.200.2:2438 from
Aug 5 17:18:53 Godel /kernel: Connection attempt to UDP 192.168.200.2:2441 from
Aug 5 17:34:18 Godel /kernel: Connection attempt to UDP 192.168.200.2:2444 from
Aug 5 17:34:18 Godel /kernel: Connection attempt to UDP 192.168.200.2:2445 from
Aug 5 17:49:44 Godel /kernel: Connection attempt to UDP 192.168.200.2:2448 from
^C
$
Cette commande affiche la partie initiale (par défaut, les 10 premières lignes) du fichier qui lui est passé en argument.
Cette commande permet d'extraire des champs (délimités par des
caractères), des lignes du fichier ou du flux qui lui est passé en
argument. Dans l'exemple qui suit, j'extrais les champs 1 (login), 3
(uid) et 4 (gid) délimités par les caractères : du
fichier /etc/passwd :
EXEMPLE :
$ cut -f1,3,4 -d: /etc/passwd
root:0:0
toor:0:11
daemon:1:1
bin:2:2
sys:3:3
sync:4:65534
man:6:12
mail:8:8
news:9:9
uucp:10:10
proxy:13:13
postgres:31:32
backup:34:34
operator:37:37
nobody:65534:65534
pascal:666:666
corto:667:666
sshd:101:65534
Cette commande ajoute un numéro de ligne à chaque ligne du fichier qui lui est passé en argument.
EXEMPLE :
$ nl ~/bin/mylock.sh
1 #!/bin/sh
2 stty -echo
3 trap '' 1 2 3 15 # ignorer les signaux
4 echo -n "Key:"
5 read key
6 echo
7 echo -n "Again:"
8 read again
9 echo
10 if [ "$key" = "$again" ]; then
11 while [ 1 ]; do
12 read again
13 if [ "$key" != "$again" ]; then
14 echo "What a fair foot !"
15 else
16 echo "unlock terminal"
17 break
18 fi
19 done
20 else
21 echo "Mismatch keys"
22 fi
23 # restaurer
24 stty echo
25 trap 1 2 3 15
Cette commande permet de morceler un fichier en plusieurs pages, souvent dans le but de l'imprimer. L'exemple montre quelques lignes de la deuxième page d'un script Perl :
EXEMPLE :
$ pr ~/bin/logfile-1.2.pl | less
...
Jan 7 14:23 2003 /home/pascal/bin/logfile-1.2.pl Page 2
open(TEMP, "temp")
|| die "problème pour ouvrir temp : $!\n";
@T = split(/\s+/, <TEMP>);
($owner, $group) = @T[2,3];
close(TEMP) || warn " problème de fermeture du fichier temp : $!";
$owner = "$owner" . ":";
$group = "$group" . ":";
system("cat /etc/passwd | grep $owner > temp");
open(TEMP, "temp")
...
Cette commande permet d'imprimer tel quel, sur la sortie standard, les contenus des fichiers qui lui sont passés en argument, i.e. elle lit le contenu de ces fichiers. Elle permet aussi de réaliser la concaténation de plusieurs fichiers dans un seul au moyen d'une redirection de la sortie standard.
EXEMPLE :
$ cat file1.txt file2.txt file3.txt > file123.txt
Cette commande GNU/Linux fonctionne comme la cat, mais imprime dans l'ordre inverse, i.e. commence par la dernière ligne.
EXEMPLES :
$ cat file.txt
ligne 1
une autre ligne, la 2 !
puis la ligne 3
$ tac file.txt
puis la ligne 3
une autre ligne, la 2 !
ligne 1
Cette commande permet l'affichage du contenu du fichier qui lui est passé en argument, en tenant compte des caractéristiques de l'écran. L'affichage se fait dont page par page, mais dans un mode unidirectionnel (du début vers la fin du fichier). Il est possible de faire des recherches sur critères en avant ou en arrière, d'avancer dans le fichier ligne par ligne ou page par page, c.f. commande help de more.
En pratique, on préfère utiliser la commande less (c.f. section suivante), qui propose d'avantages de fonctionnalités.
Cette commande généralise la commande précédente en reprenant ses caractéristiques d'affichage et y ajoutant la possibilité d'aller en arrière i.e. de remonter dans le fichier.
Comment dire à less d'ouvrir le fichier
~/elementBase/part2/procListen plaçant en haut de l'écran la ligne 15 ?Comment dire à less d'ouvrir le fichier
~/elementBase/part2/procListen plaçant en haut de l'écran la première ligne o๠apparaît le motif "tty" ?Quelles sont les deux commandes de less qui permettent de chercher un motif dans un fichier, respectivement après et avant la position courante ?
Quelles sont les commandes qui permettent d'aller à la prochaine (resp. précédente) occurence du motif recherché à travers tous les fichiers édités ?
Comment chercher dans un fichier le caractère / ?
Cette commande permet de trier le contenu du fichier qui lui est
passé en argument dans l'ordre lexicographique. Consulter le
man sort pour avoir tous les détails. Dans
l'exemple qui suit, je trie le fichier
/etc/passwd selon l'ordre numérique sur le champ
3 (uid) puis sur le champ 4 (gid). Afin de limiter l'affichage,
certaines lignes ont été volontairement enlevées du résultat.
EXEMPLE :
$ sort -n -k 3,4 -t ":" /etc/passwd
root:x:0:0:root:/root:/bin/bash
toor:x:0:11:toor's account:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/bin/false
bin:x:2:2:bin:/bin:/bin/false
sys:x:3:3:sys:/dev:/bin/false
sync:x:4:65534:sync:/bin:/bin/sync
man:x:6:12:man:/var/cache/man:/bin/false
mail:x:8:8:mail:/var/mail:/bin/sh
news:x:9:9:news:/var/spool/news:/bin/false
uucp:x:10:10:uucp:/var/spool/uucp:/bin/false
proxy:x:13:13:proxy:/bin:/bin/false
postgres:x:31:32:postgres:/var/lib/postgres:/bin/nologin
backup:x:34:34:backup:/var/backups:/bin/false
operator:x:37:37:Operator:/var:/bin/false
sshd:x:101:65534::/var/run/sshd:/bin/false
postfix:x:102:101::/var/spool/postfix:/bin/false
pascal:x:666:666:Pascal P.,,,:/home/pascal:/bin/bash
corto:x:667:666:testing account:/:/bin/false
nobody:x:65534:65534:nobody:/nonexistent:/bin/false
Cette commande permet de supprimer les doublons dans un fichier préalablement trié. On s'inspire de l'exemple précédent, avec cette fois ci un tri uniquement effecttué sur le champ gid (dans l'ordre numérique croissant), puis nous récuperons ces gids (uniquement, avec awk, que nous verrons dans Section 4, « Eléments d'initiation à awk » ) et supprimons les doublons :
EXEMPLE :
$ sort -n -k 4 -t ":" /etc/passwd | awk -F ":" '{print $4}' | uniq
0
1
2
3
8
9
10
11
12
13
32
34
37
101
666
65534
Cette commande permet de convertir les caractères de tabulations, d'un fichier passé en argument, en caractères d'espacement.
EXEMPLE :
$ cat in
#Societe Contact Telephone
TOTOR Rivière 0262 994545
HADJEE Ingar 0262 983399
HOULAN Sautron 0262 999978
$ cat in | grep -v ^# | expand -20
TOTOR Rivière 0262 994545
HADJEE Ingar 0262 983399
HOULAN Sautron 0262 999978
Cette commande (symétrique de la précédente) permet de convertir les caractères d'espacement, d'un fichier passé en argument en caractères de tabulations.
Cette commande permet de transcoder les caractères d'un flux d'entrée selon un modèle. Dans l'exemple, je montre comment transformer un flux en majuscules, puis un décalage (a remplacé par e, b par f, modulo les 26 lettres de l'alphabet).
EXEMPLE :
$ cat file.txt
Voici la 1ere ligne...
Une autre ligne, la 2 !
Puis la ligne 3
$ tr a-z A-Z < file.txt
VOICI LA 1ERE LIGNE...
UNE AUTRE LIGNE, LA 2 !
PUIS LA LIGNE 3
$ tr a-z efghijklmnopqrstuvwxyzabcd < file.txt
Vsmgm pe 1ivi pmkri...
Uri eyxvi pmkri, pe 2 !
Pymw pe pmkri 3
Cette commande transforme le flux d'entrée (fichier ou
redirection) au format octal ou héxadécimal. Dans l'exemple suivant,
j'affiche le contenu du fichier file.txt sous
forme de caractères et pour chacun d'eux son code héxadécimal associé
:
EXEMPLE :
$ cat file.txt
ligne 1
une autre ligne, la 2 !
puis la ligne 3
$ od -ax file.txt # sortie ascii et héxadécimale
0000000 l i g n e sp 1 nl u n e sp a u t r
696c 6e67 2065 0a31 6e75 2065 7561 7274
0000020 e sp l i g n e , sp l a ht sp 2 sp !
2065 696c 6e67 2c65 6c20 0961 3220 2120
0000040 nl p u i s sp l a sp l i g n e ht sp
700a 6975 2073 616c 6c20 6769 656e 2009
0000060 3 nl
0a33
0000062
Remarque : le fichier fait 50 (= 62 en octal) octets. Le code 69h désigne la lettre i, tandis que 6ch désigne le l.
Cette commande permet de découper un gros fichier en plusieurs morceaux plus petit. Dans l'exemple, je dispose d'un fichier de 3436583 octets, que je voudrais transférer sur disquettes, chacune disposant d'un mégaoctet (= 1048576 octets) de libre au plus, il faudra donc 4 disquettes. Noter, l'utilisation du prefixe pour simplifier le travail, le reste du nom est généré automatiquement :
EXEMPLE :
$ ls -l foo.pdf
-rw------- 1 pascal gnu 3436583 Aug 6 09:03 foo.pdf
$ split -b 1048576 foo.pdf foo-
$ ls -l foo*
-rw------- 1 pascal gnu 1048576 Aug 6 09:10 foo-aa
-rw------- 1 pascal gnu 1048576 Aug 6 09:10 foo-ab
-rw------- 1 pascal gnu 1048576 Aug 6 09:10 foo-ac
-rw------- 1 pascal gnu 290855 Aug 6 09:10 foo-ad
-rw------- 1 pascal gnu 3436583 Aug 6 09:03 foo.pdf
Pour reconstituer le tout il suffit de concaténer les morceaux ensemble, comme suit :
EXEMPLE :
$ cat foo-aa foo-ab foo-ac foo-ad > nfoo.pdf
$ ls -l nfoo.pdf
-rw------- 1 pascal gnu 3436583 Aug 6 09:14 nfoo.pdf
Cette commande reformate les paragraphes du fichier qui lui est passé en argument. Dans l'exemple qui suit, je limite la longueur de la ligne à 60 caractères.
EXEMPLE :
$ cat file.txt
Paragraphe numéro un : ceci est un exemple de paragraphe tapé au kilomètre sans
souci de mise en page histoire de voir un peu ce qu'il se passe. Deuxième phrase
du premier paragraphe.
Une autre ligne, la 2 !
Puis la ligne 3
$ fmt -uw 60 file.txt
Paragraphe numéro un : ceci est un exemple de paragraphe
tapé au kilomètre sans souci de mise en page histoire de
voir un peu ce qu'il se passe. Deuxième phrase du premier
paragraphe. Une autre ligne, la 2 ! Puis la ligne 3
Cette commande contraint à une longueur donnée, chaque ligne du fichier qui lui est passé en argument. Il n'y a pas de reformatage.
EXEMPLE :
$ cat file.txt
Paragraphe numéro un : ceci est un exemple de paragraphe tapé au kilomètre sans
souci de mise en page histoire de voir un peu ce qu'il se passe. Deuxième phrase
du premier paragraphe.
Une autre ligne, la 2 !
Puis la ligne 3
$ fold -w 60 file.txt
Paragraphe numéro un : ceci est un exemple de paragraphe tap
é au kilomètre sans souci de mise en page histoire de voir u
n peu ce qu'il se passe. Deuxième phrase du premier paragrap
he.
Une autre ligne, la 2 !
Puis la ligne 3
Cette commande fusionne les lignes des différents fichiers (un ou plus) qui lui sont passés en argument.
EXEMPLE :
$ cat in1
ligne 1
line 2
ligne 3 ...
line 444
$ cat in2
line aaaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbaaaaa
ligne bbbbbbbbbbbbbbbbbbbbbbbbbbb
$ paste in1 in2
ligne 1 line aaaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbaaaaa
line 2 ligne bbbbbbbbbbbbbbbbbbbbbbbbbbb
ligne 3 ...
line 444
$ paste in2 in1
line aaaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbaaaaa ligne 1
ligne bbbbbbbbbbbbbbbbbbbbbbbbbbb line 2
ligne 3 ...
line 444
Cette commande similaire à paste, utilise un champ (par défaut le premier) commun à chaque ligne des deux fichiers donnés en entrée, pour les fusionner en une ligne. Le champ commun n'est pas répété.
EXEMPLE :
$ cat in1
ligne 1
line 2
ligne 3 ...
line 444
$ cat in2
ooo line aaaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbaaaaa
aaa ligne bbbbbbbbbbbbbbbbbbbbbbbbbbb
$ join -1 1 -2 2 in1 in2
line 2 aaaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbaaaaa
ligne 3 ... bbbbbbbbbbbbbbbbbbbbbbbbbbb
$ join -1 2 -2 1 in2 in1
line ooo aaaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbaaaaa 2
ligne aaa bbbbbbbbbbbbbbbbbbbbbbbbbbb 3 ...
Précision : tout ce passe comme suit, il y a alignement sur :
EXEMPLE : # in1 in2 ligne 1 line 2 ooo line aaaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbaaaaa ligne 3 ... aaa ligne bbbbbbbbbbbbbbbbbbbbbbbbbbb line 444
Cette commande copie sur la sortie standard et dans les fichiers qui lui sont passés en argument le flux en provenance de l'entrée standard. Particulièrement utile quand on veut logger des évènements dans un fichier et en même temps les voir sur un écran.
EXEMPLE :
$ tee out1 out2 < file.txt
Voici la 1ere ligne...
Une autre ligne, la 2 !
Puis la ligne 3
$ cat out1
Voici la 1ere ligne...
Une autre ligne, la 2 !
Puis la ligne 3
$ cat out2
Voici la 1ere ligne...
Une autre ligne, la 2 !
Puis la ligne 3
Trier le fichier des mots de passe en majeur sur le champ gid (4e) et en mineur sur le champ uid (3e).
Proposition de correction.
CODE : $ sort -t":" -n -k 4 -k 3/etc/passwd # root:*:0:0:Charlie &:/root:/bin/csh toor:*:0:0:Bourne-again Superuser:/root:/bin/tcsh daemon:*:1:1:Owner of many system processes:/root:/sbin/nologin operator:*:2:5:System &:/:/sbin/nologin pop:*:68:6:Post Office Owner:/nonexistent:/sbin/nologin bin:*:3:7:Binaries Commands and Source:/:/sbin/nologin news:*:8:8:News Subsystem:/:/sbin/nologin man:*:9:9:Mister Man Pages:/usr/share/man:/sbin/nologin games:*:7:13:Games pseudo-user:/usr/games:/sbin/nologin # $FreeBSD: src/etc/master.passwd,v 1.25.2.6 2002/06/30 17:57:17 des Exp $ sshd:*:22:22:Secure Shell Daemon:/var/empty:/sbin/nologin smmsp:*:25:25:Sendmail Submission User:/var/spool/clientmqueue:/sbin/nologin mailnull:*:26:26:Sendmail Default User:/var/spool/mqueue:/sbin/nologin bind:*:53:53:Bind Sandbox:/:/sbin/nologin cyrus:*:60:60:the cyrus mail server:/nonexistent:/sbin/nologin uucp:*:66:66:UUCP pseudo-user:/var/spool/uucppublic:/usr/libexec/uucp/uucico xten:*:67:67:X-10 daemon:/usr/local/xten:/sbin/nologin pgsql:*:70:70:PostgreSQL Daemon:/usr/local/pgsql:/bin/sh www:*:80:80:World Wide Web Owner:/nonexistent:/sbin/nologin mysql:*:88:88:MySQL Daemon:/var/db/mysql:/sbin/nologin pascal:*:666:666:Pascal P;:/home/pascal:/bin/tcsh miji:*:667:666:Miji M.P.:/home/miji:/bin/tcsh postfix:*:1001:1001:Postfix Mail System:/var/spool/postfix:/sbin/nologin jabber:*:1002:1003:Jabber Daemon:/nonexistent:/nonexistent stunnel:*:1003:1004:stunnel Daemon:/nonexistent:/sbin/nologin tty:*:4:65533:Tty Sandbox:/:/sbin/nologin kmem:*:5:65533:KMem Sandbox:/:/sbin/nologin nobody:*:65534:65534:Unprivileged user:/nonexistent:/sbin/nologinSous FreeBSD le fichier
/etc/passwdcontient des commentaires, lignes commençant par le symbole #. Reprendre le travail précédent en éliminant les lignes de commentaires.Proposition de correction.
$ clear && grep -v '^#' /etc/passwd | sort -t ":" -n -k 4 -k 3 root:*:0:0:Charlie &:/root:/bin/csh toor:*:0:0:Bourne-again Superuser:/root:/bin/tcsh daemon:*:1:1:Owner of many system processes:/root:/sbin/nologin operator:*:2:5:System &:/:/sbin/nologin pop:*:68:6:Post Office Owner:/nonexistent:/sbin/nologin bin:*:3:7:Binaries Commands and Source:/:/sbin/nologin news:*:8:8:News Subsystem:/:/sbin/nologin man:*:9:9:Mister Man Pages:/usr/share/man:/sbin/nologin games:*:7:13:Games pseudo-user:/usr/games:/sbin/nologin sshd:*:22:22:Secure Shell Daemon:/var/empty:/sbin/nologin smmsp:*:25:25:Sendmail Submission User:/var/spool/clientmqueue:/sbin/nologin mailnull:*:26:26:Sendmail Default User:/var/spool/mqueue:/sbin/nologin bind:*:53:53:Bind Sandbox:/:/sbin/nologin cyrus:*:60:60:the cyrus mail server:/nonexistent:/sbin/nologin uucp:*:66:66:UUCP pseudo-user:/var/spool/uucppublic:/usr/libexec/uucp/uucico xten:*:67:67:X-10 daemon:/usr/local/xten:/sbin/nologin pgsql:*:70:70:PostgreSQL Daemon:/usr/local/pgsql:/bin/sh www:*:80:80:World Wide Web Owner:/nonexistent:/sbin/nologin mysql:*:88:88:MySQL Daemon:/var/db/mysql:/sbin/nologin pascal:*:666:666:Pascal P;:/home/pascal:/bin/tcsh miji:*:667:666:Miji M.P.:/home/miji:/bin/tcsh postfix:*:1001:1001:Postfix Mail System:/var/spool/postfix:/sbin/nologin jabber:*:1002:1003:Jabber Daemon:/nonexistent:/nonexistent stunnel:*:1003:1004:stunnel Daemon:/nonexistent:/sbin/nologin tty:*:4:65533:Tty Sandbox:/:/sbin/nologin kmem:*:5:65533:KMem Sandbox:/:/sbin/nologin nobody:*:65534:65534:Unprivileged user:/nonexistent:/sbin/nologin
Remplacer le séparateur de champ (:) du fichier
/etc/passwdpar le séparateur de tabulation horizontal '\t'. Mettre le tout dans un fichier intitulé~/mypasswd. Vérifier le résultat.Proposition de correction.
$ cat /etc/passwd | tr ":" "\t" > ~/mypasswd
Vous avez sans doute remarqué un défaut d'alignement des colonnes. Proposer une solution permettant un alignement de chaque colonne, sans décalage à l'affichage. Même fichier de départ, même fichier d'arrivée
Proposition de correction.
$ cat /etc/passwd | tr ":" "\t" | expand -32 > ~/mypasswd
[7] Write programs that do one thing and do it well. Write programs to work together. Write programs to handle text streams, because that is a universal interface.