From 549c3929b88a8f5bd223e60055ea20d7788ecb60 Mon Sep 17 00:00:00 2001 From: Robert Alessi Date: Fri, 14 Sep 2018 13:58:46 +0200 Subject: added a section on filters --- fichiers/01-ligne-de-commande.tex | 133 +++++++++++++++++++++++++++++++++++--- 1 file changed, 125 insertions(+), 8 deletions(-) (limited to 'fichiers') diff --git a/fichiers/01-ligne-de-commande.tex b/fichiers/01-ligne-de-commande.tex index 323ab50..5509a4c 100644 --- a/fichiers/01-ligne-de-commande.tex +++ b/fichiers/01-ligne-de-commande.tex @@ -579,7 +579,7 @@ interprété comme une suite distincte de trois arguments: \end{enumerate} Et le \emph{shell} ne pourra pas le trouver. Il y a deux solutions possibles: -\begin{enumerate} +\begin{enumerate}\label{ref:guillemets-simples-intro} \item Placer le nom du fichier entre guillemets simples: \begin{minted}{text} [robert@kiddo courses]$ ls 'photos de vacances.zip' @@ -706,7 +706,7 @@ détruira absolument tout sans demande de confirmation pour ne laisser que les fichiers cachés du répertoire courant dont le nom commence par un point. -\subsection{Wildcards} +\section{Wildcards} \label{sec:wildcards} Les \emph{wildcards}, ou \enquote{métacaractères} sont des caractères ou des séquences de caractères qui servent à représenter des séries de @@ -729,7 +729,7 @@ ls [QGH]* majuscules ou minuscules. \end{itemize} -\subsection{Redirection et chaînage} +\section{Redirection et chaînage} \label{sec:redir-et-chain} Nous avons vu jusqu'ici que les commandes renvoient normalement leur résultat sur le terminal lui-même. On peut cependant rediriger ce que @@ -751,10 +751,10 @@ s'assure que ce fichier a bien été créé, puis on demande à la commande \verb|cat| d'en afficher le contenu au terminal. Les trois commandes sont entrées aux lignes 1, 2 et 4: \begin{minted}[escapeinside=||,linenos]{text} -[robert@kiddo courses]$ ls -l > |\textcolor{blue}{all-files.txt}| +[robert@kiddo courses]$ ls -l > |\textcolor{red}{all-files.txt}| [robert@kiddo courses]$ ls -|\textcolor{blue}{all-files.txt}| fichiers ls-R makefile _preamble.tex README.md README.tex -[robert@kiddo courses]$ cat |\textcolor{blue}{all-files.txt}| +|\textcolor{red}{all-files.txt}| fichiers ls-R makefile _preamble.tex README.md README.tex +[robert@kiddo courses]$ cat |\textcolor{red}{all-files.txt}| total 24 drwxr-xr-x 3 robert robert 4096 13 sept. 17:15 fichiers -rw-r--r-- 1 robert robert 88 13 sept. 13:34 ls-R @@ -764,8 +764,10 @@ drwxr-xr-x 3 robert robert 4096 13 sept. 17:15 fichiers -rw-r--r-- 1 robert robert 1570 12 sept. 12:13 README.tex \end{minted} +\label{ref:wc-intro} L'exemple suivant est plus subtil. Il fait appel à une commande, -\verb|wc -l| qui compte les lignes des fichiers: +\verb|wc -l| qui compte les lignes des fichiers\footnote{Voir plus + loin \vpageref{ref:wc}.}: \begin{minted}[linenos]{text} [robert@kiddo courses]$ wc -l makefile 21 makefile @@ -791,7 +793,7 @@ caractère \emph{pipe} (\verb+|+). Avant d'aller plus loin, étudions rapidement deux nouvelles commandes qui servent à filtrer le contenu des fichiers. -\paragraph{head} +\paragraph{head}\label{ref:head-tail} \mintinline{text}|head - fichier| affiche au terminal les \verb|| premières lignes d'un fichier. Sans l'option \mintinline{text}|-|, les 10 premières lignes sont @@ -835,4 +837,119 @@ sera ignorée: 6 \end{minted} +\section{Filtrage} +\label{sec:filtrage} + +Comme leur nom l'indique, les commandes de filtrage servent à mettre +en forme des fichiers texte tout en sélectionnant certaines parties de +leur contenu. + +Nous en avons étudié deux plus haut (\vpageref{ref:head-tail}): +\begin{enumerate} +\item \verb|head| qui sélectionne les premières lignes d'un fichier. +\item \verb|tail| qui sélectionne les dernières lignes d'un fichier. +\end{enumerate} + +On ajoutera ici les commandes suivantes: + +\paragraph{cat} +Affiche au terminal tout le contenu d'un fichier: +\begin{minted}{text} +[robert@kiddo courses]$ cat ls-R +./fichiers/01-ligne-de-commande.tex +./makefile +./_preamble.tex +./README.md +./README.tex +\end{minted} + +\paragraph{wc}\label{ref:wc} +Pour \emph{word count}. Cette commande a été utilisée plus haut une +fois avec l'option \verb|-l| pour compter les lignes d'un fichier +(\vpageref{ref:wc-intro}). Utilisée sans option, elle retourne le +nombre de lignes (\verb|-l|), de mots (\verb|-w|) et de caractères +(\verb|-m|) d'un fichier: +\begin{minted}{text} +[robert@kiddo courses]$ wc makefile + 21 114 627 makefile +\end{minted} + +\paragraph{cut} +Permet de mettre en forme des données. Prenons l'exemple du fichier +suivant: \\ \mintinline{text}|etudiants.txt| +\begin{minted}{text} +Fonsec Sophie 123456 sophie.fonsec@quelquepart.net +Pédot Hector 456789 hector.pedot@ailleurs.org +\end{minted} +Il contient sur chaque ligne un nom, un prénom, un matricule et une +adresse email. Nous souhaitons collecter simplement les données +suivantes: +\begin{enumerate} +\item Nom +\item Prénom +\item email +\end{enumerate} +La commande \verb|cut| peut être utilisée à cet effet avec les deux +options suivantes: +\begin{enumerate} +\item \mintinline{text}|-d| indiquer par quel caractère les données + sont délimitées (ici un espace). +\item \mintinline{text}|-f| (pour \emph{field} en anglais) pour + indiquer quelles données doivent être sélectionnées (ici, les + éléments 1, puis 2, puis 4). +\end{enumerate} +\begin{minted}{text} +[robert@kiddo courses]$ cut -d ' ' -f 2,1,4 etudiants.txt +Fonsec Sophie sophie.fonsec@quelquepart.net +Pédot Hector hector.pedot@ailleurs.org +\end{minted} + +Mais comment faire pour modifier l'ordre des données et les mettre en +forme de façon à placer le prénom avant le nom et avoir les adresses +email entre crochets pointus? Comment faire aussi pour récupérer les +données dans un tableur? + +\paragraph{awk} +Ce programme accessible à la ligne de commande permet d'effectuer ce +travail facilement. Il sélectionne les données dans l'ordre que l'on +souhaite à l'aide de variables: \verb|$1|, \verb|$2|, \verb|$3|, +\&c. Il effectue ensuite ce qu'on appelle des \emph{actions}, +lesquelles sont spécifiées entre accolades \verb|{}|. Nous allons ici +utiliser l'action \verb|print|. Voici la commande: +\begin{minted}{text} +[robert@kiddo courses]$ awk '{print $2 ";" $1 ";<" $4 ">"}' etudiants.txt +Sophie;Fonsec; +Hector;Pédot; +\end{minted} +\begin{quoting} + \textbf{Commentaire} + \begin{enumerate} + \item La totalité de l'argument passé à \verb|awk| a été placée + entre guillemets simples \verb|' '|. On renvoie sur ce point à la + règle posée \vpageref{ref:guillemets-simples-intro}. + \item Entre les accolades, l'instruction \verb|print| accomplit + successivement les tâches suivantes: + \begin{enumerate} + \item Impression du champ 2. + \item Impression de la chaîne littérale \verb|;| placée entre + guillemets\footnote{On n'aurait pas pu employer ici les + guillemets simples car le premier guillemet simple aurait + évidemment été compris comme le guillemet fermant celui qui se + trouve juste avant l'accolade ouvrante.}. + \item Impression du champ 1. + \item Impression de la chaîne littérale \verb|;<| placée entre + guillemets. + \item Impression du champ 4. + \item Impression de la chaîne littérale \verb|>| placée entre + guillemets. + \end{enumerate} + \end{enumerate} +\end{quoting} +Pour terminer, il suffit de renommer le fichier \verb|etudiants.txt| +en \verb|etudiants.csv| par la commande: +\begin{minted}{text} +mv etudiants.txt etudiants.csv +\end{minted} +et de l'ouvrir dans LibreOffice Calc. + \end{document} -- cgit v1.2.3