TP9 – Les commandes filtres

Introduction

Les commandes filtres sont des commandes que l'on enchaîne avec plusieurs tubes pour modifier à la volée un flux d'entrées/sorties pour l'amener dans une forme souhaitée.

Les filtres suivants seront utilisés dans les exercices de ce TP :

  • tr : traduire un caractère en un autre
  • sort : trier dans différents ordre
  • grep : extraire des lignes qui contiennent des expressions recherchées
  • cut : extraire des champs dans chaque ligne
  • awk : un cut amélioré pour ce TP (bien plus puissant dans le cas général)

Défis

À partir du fichier telephone.txt du TP8 voici les commandes qui permettent de répondre aux questions suivantes. Votre travail consistera à comprendre comment chaque solution fonctionne.

Afficher les lignes dans l'ordre alphabétique des noms :

cat telephone.txt | sort

Afficher dans l'ordre alphabétique des prénoms

cat telephone.txt | tr ';' ' ' | sort -k 2 | tr ' ' ';'

(remplacer les ' ;' par des ' ' dans un premier temps puis ramener les ' ;')

Pour comprendre l'évolution du flux de sortie au travers des filtres, visulaliser les sorties après chaque filtre :

cat telephone.txt
cat telephone.txt | tr ';' ' '
cat telephone.txt | tr ';' ' ' | sort -k 2
cat telephone.txt | tr ';' ' ' | sort -k 2 | tr ' ' ';'

Afficher les Dupond dans l'ordre alphabétique inverse des prénoms :

cat telephone.txt | grep Dupond | tr ';' ' ' | sort -r -k 1 | tr ' ' ';'

Afficher les noms sans les Dupond et Dupont :

cat telephone.txt | grep -v Dupon

Afficher les lignes qui ont un numéro de portable :

cat telephone.txt | grep ";06"

Afficher les prénoms de ceux qui ont un numéro de portable :

cat telephone.txt | grep ";06" | cut -d";" -f 2

Afficher les prénoms et noms de ceux qui ont un numéro de portable :

cat telephone.txt | grep ";06" | awk -F";" '{print $2 " " $1}'

Afficher les prénoms et noms de ceux qui ont un numéro de portable sauf les Dupond :

cat telephone.txt | grep ";06" | awk -F";" '{print $2 " " $1}' | grep -v Dupond 

Génération d'un fichier HTML à partir d'un texte

Le fichier texte telephone.txt contient un tableau à trois colonnes (nom, prénom, numéro de téléphone). Les commandes vues dans l'exercice précédent suffisent à transformer ce fichier texte en une page web !

Nous voulons donc écrire un script qui génère une page HTML qui contient un tableau rassemblant les informations du calepin téléphonique dans l'ordre prénom, nom, téléphone, trié selon les prénoms.

Préliminaire : structure d'une page web

Une page web est composée de balises HTML qui sont des mots entre les caractères < et >.

Voici une page web très simple comportant un titre, un paragraphe et un tableau :


				

Voici comment le navigateur affiche cette page.

Le corps de la page web est compris entre les balises ouvrante <body> et fermante </body>.

Le tableau s'introduit avec la balise <table>. Vient ensuite les lignes (balises <tr>), composées de cases (balises <td>).

Notre objectif est de développer une commande qui génère un tel fichier texte en introduisant les informations téléphoniques dans les cases d'un tableau.

Démarche

Nous allons nous inspirer de la dernière commande de l'exercice précédent :

cat telephone.txt | awk -F";" '{print $2 " " $1 " " $3}'

On peut écrire ce que l'on veut entre les champs :

cat telephone.txt | awk -F";" '{print "--> " $2 ", " $1 " : " $3 " !" }'
 --> Alex, Terieur : 0478858069 !
 --> Alain, Terieur : 0563868985 !
 --> Albert, Dupond : 04961868957 !
 ...

Pour construire le tableau HTML, il suffit d'écrire les bonnes balises pour que chaque ligne devienne une ligne du tableau :

cat telephone.txt | awk -F";" '{print "<tr><td>" $2 "</td><td>" $1 "</td><td>" $3 "</td></tr>" }'
 <tr><td>Alex</td><td>Terieur</td><td>0478858069</td></tr>
 <tr><td>Alain</td><td>Terieur</td><td>0563868985</td></tr>
 <tr><td>Albert</td><td>Dupond</td><td>04961868957</td></tr>

Il ne reste plus qu'à faire précéder ces lignes par un début de fichier HTML et les faire suivre par une fin qui clôt le document.

Voici le script genere_calepin.sh qui s'en charge :


				

Donnez-lui le droit d'exécution.

Et redirigez la sortie standard du script vers un fichier :

./genere_calepin.sh > telephone.html

Visionnez telephone.html dans le navigateur.

Variante

Nous voulons maintenant que le script remplisse le fichier telephone.html sans avoir à rediriger la sortie standard de la commande vers ce fichier :

 ./genere_calepin_v2.sh
 --- Transformation du fichier telephone.txt en telephone.html ---
 (le fichier telephone.html est créé directement)
Cela s'obtient en utilisant les redirections :