2. Utilitaires de textprocessing

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.

2.1. wc, tail, head, cut, nl, pr

2.1.1. wc (1)

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

Exercice - wc
  1. En utilisant la commande ps -axcw -o ppid,pid,user,vsz,time,command., créez le fichier ~/elementBase/part2/process contenant des informations sur les processus en cours.

  2. En utilisant la commande ps -aux., créez le fichier ~/elementBase/part2/ps-aux contenant des informations sur les processus en cours.

  3. Combien de lignes contiennent les fichiers ?

2.1.2. tail (1)

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
$

Exercice - tail
  1. Créez le fichier ~/elementBase/part2/procList en supprimant la première ligne du fichier ~/elementBase/part2/process.

2.1.3. head (1)

Cette commande affiche la partie initiale (par défaut, les 10 premières lignes) du fichier qui lui est passé en argument.

2.1.4. cut (1)

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

2.1.5. nl (1)

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

2.1.6. pr (1)

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") 
...

2.2. Utilitaires cat, tac, more, less, sort, uniq

2.2.1. cat (1)

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                               

Exercice - cat
  1. Utiliser cat pour écrire deux lignes de texte et les mettre dans le fichier ~/elementBase/part2/exo1/notes.

  2. Depuis le fichier ~/elementBase/part2/exo1/notes, écrire la commande permettant d'obtenir le fichier ~/elementBase/part2/exo1/notesNum, dont les lignes sont numérotées.

2.2.2. tac

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

2.2.3. more (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.

2.2.4. less (1)

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.

Exercice - Less
  1. Comment dire à  less d'ouvrir le fichier ~/elementBase/part2/procList en plaçant en haut de l'écran la ligne 15 ?

  2. Comment dire à  less d'ouvrir le fichier ~/elementBase/part2/procList en plaçant en haut de l'écran la première ligne o๠apparaît le motif "tty" ?

  3. Quelles sont les deux commandes de less qui permettent de chercher un motif dans un fichier, respectivement après et avant la position courante ?

  4. Quelles sont les commandes qui permettent d'aller à  la prochaine (resp. précédente) occurence du motif recherché à  travers tous les fichiers édités ?

  5. Comment chercher dans un fichier le caractère / ?

2.2.5. sort (1)

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

Exercice - Sort
  1. Triez le fichier ~/elementBase/part2/procList sur le champ PPID puis sur le champ PID.

  2. Triez les processus le fichier ~/elementBase/part2/procList sur la taille de leur mémoire virtuelle.

2.2.6. uniq (1)

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

Exercice
  1. En utilisant ~/elementBase/part2/procList, donnez la liste ordonnée des processus qui ont au moins un fils.

2.3. expand, unexpand, tr

2.3.1. expand (1)

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 

2.3.2. unexpand (1)

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.

2.3.3. tr (1)

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

2.4. od, split, fmt, fold

2.4.1. od (1)

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.

2.4.2. split (1)

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

2.4.3. fmt (1)

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

2.4.4. fold (1)

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

2.5. paste, join, tee

2.5.1. paste (1)

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


2.5.2. join (1)

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

Exercice
  1. En utilisant les fichiers ~/elementBase/part2/procList, et ~/elementBase/part2/ps-aux, créez le fichier ~/elementBase/part2/procList2 contenant les champs PID, PPID, USER, %CPU et COMMAND, en séparant les champs par des tabulations.

2.5.3. tee (1)

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

2.6. Exercices

Exercice - Textprocessing (1)

  1. 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/nologin
    
    
  2. Sous FreeBSD le fichier /etc/passwd contient 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
    
    

Exercice - Textprocessing (2)

  1. Remplacer le séparateur de champ (:) du fichier /etc/passwd par 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                                    
    
    
  2. 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.

Skins :
Transparence
Simple
Page Accueil
Formation