============================ Séance 3 : Flux de données ============================ .. include:: commondefs.rst.inc .. ifslides:: .. include:: credits.rst.inc .. index:: flux standard .. _flux_standards: Flux standards ============== Que fait le programme suivant ? .. code-block:: c #include int main(int argc, char* argv[]) { char* nom = readline("Quel est votre nom ? "); printf("Bonjour %s !\n", nom); } .. note:: Réponse typique : il lit une chaîne depuis le clavier, puis affiche une chaîne à l'écran. Mais c'est en fait un cas pariculier de ce qu'il fait. .. nextslide:: .. index:: entrée standard, sortie standard, erreur standard Sous Linux, la plupart des programmes démarrent avec 3 flux de données préalablement ouverts : * l'entrée standard, destinée à alimenter le programme en données, * la sortie standard, destinée à recevoir les résultats du programme, * l'erreur standard, destinée à recevoir les messages d'erreur générés par le programme. .. note:: On emploie parfois le mot « fichier » plutôt que flux, bien qu'il prête à confusion. .. nextslide:: .. index:: flux standard;stdin flux standard;stdout flux standard;stderr .. figure:: https://upload.wikimedia.org/wikipedia/commons/7/70/Stdstreams-notitle.svg Source: `Wikipedia `_ Les processus lancés par le shell héritent de ses flux standard, et donc correspondent *par défaut* au clavier et a l'affichage du terminal. Mais il est possible de changer cela. .. index:: redirection Redirection =========== Une ligne de commande peut comporter un ou plusieurs des éléments suivants : * ``<`` suivi d'un nom de fichier (chemin) * ``>`` suivi d'un nom de fichier (chemin) * ``2>`` suivi d'un nom de fichier (chemin) Ces éléments **redirigent** (ou « rebranchent ») l'un des flux standards (l'entrée, la sortie et l'erreur standard, respectivement) sur le fichier indiqué. .. nextslide:: .. hint:: Les redirections sont interprétéss par les shell *avant* d'exécuter le programme, et ne sont donc pas vues par le programme. Exemple :: ls -l >mes_fichiers.txt /dev/null --------- ``/dev/null`` est un fichier virtuel présent sur tous les systèmes UNIX. Il agit comme un « trou noir », tout ce qui est écrit dans ce fichiers est simplement supprimé. Exemple :: # n'affiche que les messages d'erreurs # (répertoires non autorisés pour l'utilisateur) ls /var/*/* >/dev/null .. index:: redirection;ajout Redirection par ajout --------------------- Les redirections classiques ``>`` et ``2>`` vident le fichier destination avant d'écrire dedans. Si on souhaite conserver le contenu précédent du fichier, on peut utiliser à la place ``>>`` ou ``2>>``, respectivement. Exemple :: ls -l Documents >>mes_fichiers.txt Outils de manipulation de texte =============================== .. contents:: :local: :depth: 1 Philosophie UNIX ---------------- * chaque outil fait *une seule* chose, mais la fait *bien* * le |SE| offre des mécanismes pour *combiner* les outils wc [options] — *word count* --------------------------- .. program: wc Compte les mots (ou d'autres choses) sur son entrée standard. En l'absence d'options, affiche le nombre de lignes, de mots et d'octets. .. option:: -c, --bytes Affiche le nombre d'octets. .. option:: -w, --words Affiche le nombre de mots. .. option:: -l, --lines Affiche le nombre de lignes. .. option:: -L, --max-line-length Affiche la longueur de la ligne la plus longue. sort [OPTIONS] -------------- .. program:: sort Trie les lignes lues sur l'entrée standard, et les affiche dans l'ordre sur la sortie standard. .. option:: -r, --reverse Inverse l'ordre du tri. .. option:: -n, --numeric-sort Interprète les valeurs comme des nombres si possible. .. note:: Dans l'ordre alphabétique (utilisé par défaut), ``10`` arrive avant ``2`` par exemple. .. option:: -k, --key=NUMÉRO Le champs sur lequel trier (les champs sont délimitées par tous les types d'espaces). .. note:: En fait l'option ``-k`` est beaucoup plus flexible que cela. .. option:: -t, --field-separator=CARACTÈRE Utilise ``CARACTÈRE`` comme délimiteur de champs pour ``-k``, au lieu des espaces. cut [OPTIONS] ------------- .. program:: cut Reproduit sur sa sortie standard une sous-partie de chaque ligne lue sur son entrée standard. .. option:: -f, --fields=LIST Ne conserve que les champs spécifiés par ``LIST``, qui est une liste séparée par des virgules de numéros (le premier champs est a le numéro 1) ou de *plages* de numéros. Les champs sont délimités par des tabulations. .. option:: -d, --delimiter=CARACTÈRE Utilise ``CARACTÈRE`` comme délimiteur de champs pour ``-f``, au lieu des tabulation. .. option:: -c, --characters=LIST Ne conserve que les caractères spécifiés par ``LIST``, avec la même syntaxe que pour ``-f``. Exemples d'utilisation de cut ````````````````````````````` :: # ne garde que les colonnes 1 et 3 cut -d, -f1,3 columns.csv # affiche les noms d'utilisateurs inscrits cut -d: -f1 dest egrep [OPTIONS] ----------------------- .. program:: sort N'affiche sur la sortie standard que les lignes (lues sur l'entrée standard) contenant l'`expression régulière `:ref: ````. .. option:: -i, --ignore-case Ignore les différences de casse (différence majuscule/minuscule) entre le texte lu et l'expression régulière. .. option:: -v, --invert-match Au lieu d'afficher les lignes qui contiennent ````, affiche celles qui ne la contiennent pas. tr | tr -d — *translate* --------------------------------------------- .. program:: tr Reproduit sur sa sortie standard le texte lu sur l'entrée standard, en modifiant (première variante) ou supprimant (deuxième variante) certains caractères. .. describe:: Une liste de caractères, énumérés en extension, ou sous forme de plages de caractères séparés par un tiret ``-``. Exemple : ``02468``, ``a-zàâéèêîôû``, ``a-zA-Z`` .. option:: -c, --complement Transforme les caractères qui n'appartiennent *pas* à ````. .. nextslide:: .. describe:: Une liste de caractères, suivant les mêmes règles que ````. Chaque caractère de ```` sera remplacé par le caractère correspondant de ````. Si ```` est plus court que ````, le dernier caractère est implicitement répété autant de fois que nécessaire. .. option:: -d, --delete Supprime les éléments de ````. Exemples d'utilisation de tr ```````````````````````````` :: # remplace toutes les majuscules par des minuscules tr A-Z a-z dest # remplace tous les chiffres par X tr 0-9 X dest # remplace tout ce qui n'est pas une lettre par une espace tr -c A-Za-z " " dest # supprime les espaces, tabulations, retours à la ligne tr -d " \t\n" dest sed -r s//∕g -------------------------- .. program:: sed Reproduit sur sa sortie standard le texte lu sur l'entrée standard, en remplaçant toutes les occurences de l'`expression régulière `:ref: par le texte ```` (qui peut être vide). .. note:: ``sed`` (`serial editor`:eng:) est en fait un éditeur de texte programmable. Ceci n'est *qu'une* des nombreuses instructions qu'il supporte. .. _regex: Expressions régulières ====================== Une expression régulière (ou *regex*) décrit dans une syntaxe spécialisée *une famille de chaînes de caractères*. Par exemple : * ``a.*z`` : tout chaîne qui commence par ``a`` et se termine par ``z`` * ``[a-z]{1,5}`` : tous les mots de 1 à 5 lettres minuscules * ``\d{2}/\d{2}/\d{4}`` : toutes les dates au format jj/mm/aaaa (un peu plus) * ``[a-z0-9.-]+@[a-z0-9.-]+(\.[a-z]+)*`` : toutes les adresses e-mail (un peu moins) .. nextslide:: Les expressions régulières sont également utilisables * dans la plupart les langages de programmation, * dans les fonctions de recherche avancée des éditeurs de texte, * ... Caractères spéciaux ------------------- * ``.`` : n'importe quel caractère * ``[...]`` : un caractère appartenant à la séquence décrite, exemples : + ``[xyz]`` : un des caractères ``x``, ``y`` ou ``z`` + ``[^xyz]`` : n'importe quel caractère *autre* que ``x``, ``y`` ou ``z`` + ``[0-9]`` : n'importe quel chiffre décimal + ``[a-zA-Z_]`` : n'importe quelle lettre minuscule ou majuscule, ou l'`underscore`:eng:. * ``^`` : le début de la ligne * ``$`` : la fin de la ligne Modificateurs ------------- Si on suppose que *a* et *b* sont des expressions régulières quelconques : * ``(a)*`` : un texte qui satisfait *a* zéro fois ou plus * ``(a)+`` : un texte qui satisfait *a* une fois ou plus * ``(a)?`` : un texte qui satisfait *a* zéro ou une fois * ``(a){i,j}`` : un texte qui satisfait *a* entre *i* et *j* fois * ``(a)|(b)`` : un texte qui satisfait *a* ou *b* Échappements ------------ Pour éviter que ``egrep`` ou ``sed`` n'interprète un caractère spécial on le fera précéder d'un antislash (``\``). Exemple:: # affiche toutes les lignes de src qui contiennent un a suivi d'une étoile egrep "a\*" .png # triés par numéro ls | egrep "IMG_[0-9]+.png" | sort -n -k2 -t_ Travaux dirigés =============== .. ifslides:: `Consultez les ici <../s3.html#travaux-diriges>`_ .. ifnotslides:: Exercice 1 : redirections ------------------------- #. Stockez, dans un fichier texte, la liste des fichiers et répertoires de votre répertoire d’accueil. Vérifiez que cela a fonctionné. #. Écrivez "fin" à la fin de ce fichier **sans utiliser** d'éditeur de texte. #. Enregistrez dans un fichier la page de manuel (``man``) de la commande ``ls``. Exercice 2 : filtres et expressions régulières (encore) ------------------------------------------------------- Récupérez le fichier `fruits.txt <_static/fruits.txt>`_. Affichez : #. Les lignes dont le nom est "Fraise" ou "fraise" #. Les lignes ou "ai" est présent dans le nom #. Les lignes dont le nom se finit en "se" #. Les lignes dont le nom contient un chiffre #. Les lignes dont le nom fait exactement 5 caractères Exercice 3 : filtres et expressions régulières ---------------------------------------------- Récupérez le fichier `contacts.txt <_static/contacts.txt>`_. Chaque ligne de ce fichier comporte un nom, une ville et un numéro de téléphones, séparés par le caractère deux-points (``:``). #. Affichez uniquement les noms et numéros de téléphone de l’annuaire. #. Affichez les informations sur un correspondant connu par son nom. #. Affichez l’annuaire trié sur le nom. #. Constituez un nouvel annuaire contenant tous les correspondants sauf "Jean Dupont". #. Affichez le nombre de correspondants. #. Affichez les correspondants qui habitent Lyon. #. Affichez les correspondants dont le nom commence par "d". Exercice 4: Dé-htmliseur ------------------------ Enregistrez cette page Web dans votre répertoire `home`:eng:. À l'aide d'une ligne de commande, créez un fichier qui contient le texte de ce ce fichier HTML, débarassé de toutes ses balises.