aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Alessi <alessi@robertalessi.net>2018-09-14 13:58:46 +0200
committerRobert Alessi <alessi@robertalessi.net>2018-09-14 13:58:46 +0200
commit549c3929b88a8f5bd223e60055ea20d7788ecb60 (patch)
tree137194b357e458cdd6a7fa6c70fd9d0cb8facd80
parent08bebf4f035ed688bbfabf1b92c29ad7534d92d9 (diff)
downloadcourses-549c3929b88a8f5bd223e60055ea20d7788ecb60.tar.gz
added a section on filters
-rw-r--r--fichiers/01-ligne-de-commande.tex133
1 files changed, 125 insertions, 8 deletions
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:
579\end{enumerate} 579\end{enumerate}
580Et le \emph{shell} ne pourra pas le trouver. Il y a deux solutions 580Et le \emph{shell} ne pourra pas le trouver. Il y a deux solutions
581possibles: 581possibles:
582\begin{enumerate} 582\begin{enumerate}\label{ref:guillemets-simples-intro}
583\item Placer le nom du fichier entre guillemets simples: 583\item Placer le nom du fichier entre guillemets simples:
584\begin{minted}{text} 584\begin{minted}{text}
585[robert@kiddo courses]$ ls 'photos de vacances.zip' 585[robert@kiddo courses]$ ls 'photos de vacances.zip'
@@ -706,7 +706,7 @@ détruira absolument tout sans demande de confirmation pour ne laisser
706que les fichiers cachés du répertoire courant dont le nom commence 706que les fichiers cachés du répertoire courant dont le nom commence
707par un point. 707par un point.
708 708
709\subsection{Wildcards} 709\section{Wildcards}
710\label{sec:wildcards} 710\label{sec:wildcards}
711Les \emph{wildcards}, ou \enquote{métacaractères} sont des caractères 711Les \emph{wildcards}, ou \enquote{métacaractères} sont des caractères
712ou des séquences de caractères qui servent à représenter des séries de 712ou des séquences de caractères qui servent à représenter des séries de
@@ -729,7 +729,7 @@ ls [QGH]*
729 majuscules ou minuscules. 729 majuscules ou minuscules.
730\end{itemize} 730\end{itemize}
731 731
732\subsection{Redirection et chaînage} 732\section{Redirection et chaînage}
733\label{sec:redir-et-chain} 733\label{sec:redir-et-chain}
734Nous avons vu jusqu'ici que les commandes renvoient normalement leur 734Nous avons vu jusqu'ici que les commandes renvoient normalement leur
735résultat sur le terminal lui-même. On peut cependant rediriger ce que 735ré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
751\verb|cat| d'en afficher le contenu au terminal. Les trois commandes 751\verb|cat| d'en afficher le contenu au terminal. Les trois commandes
752sont entrées aux lignes 1, 2 et 4: 752sont entrées aux lignes 1, 2 et 4:
753\begin{minted}[escapeinside=||,linenos]{text} 753\begin{minted}[escapeinside=||,linenos]{text}
754[robert@kiddo courses]$ ls -l > |\textcolor{blue}{all-files.txt}| 754[robert@kiddo courses]$ ls -l > |\textcolor{red}{all-files.txt}|
755[robert@kiddo courses]$ ls 755[robert@kiddo courses]$ ls
756|\textcolor{blue}{all-files.txt}| fichiers ls-R makefile _preamble.tex README.md README.tex 756|\textcolor{red}{all-files.txt}| fichiers ls-R makefile _preamble.tex README.md README.tex
757[robert@kiddo courses]$ cat |\textcolor{blue}{all-files.txt}| 757[robert@kiddo courses]$ cat |\textcolor{red}{all-files.txt}|
758total 24 758total 24
759drwxr-xr-x 3 robert robert 4096 13 sept. 17:15 fichiers 759drwxr-xr-x 3 robert robert 4096 13 sept. 17:15 fichiers
760-rw-r--r-- 1 robert robert 88 13 sept. 13:34 ls-R 760-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
764-rw-r--r-- 1 robert robert 1570 12 sept. 12:13 README.tex 764-rw-r--r-- 1 robert robert 1570 12 sept. 12:13 README.tex
765\end{minted} 765\end{minted}
766 766
767\label{ref:wc-intro}
767L'exemple suivant est plus subtil. Il fait appel à une commande, 768L'exemple suivant est plus subtil. Il fait appel à une commande,
768\verb|wc -l| qui compte les lignes des fichiers: 769\verb|wc -l| qui compte les lignes des fichiers\footnote{Voir plus
770 loin \vpageref{ref:wc}.}:
769\begin{minted}[linenos]{text} 771\begin{minted}[linenos]{text}
770[robert@kiddo courses]$ wc -l makefile 772[robert@kiddo courses]$ wc -l makefile
77121 makefile 77321 makefile
@@ -791,7 +793,7 @@ caractère \emph{pipe} (\verb+|+).
791Avant d'aller plus loin, étudions rapidement deux nouvelles commandes 793Avant d'aller plus loin, étudions rapidement deux nouvelles commandes
792qui servent à filtrer le contenu des fichiers. 794qui servent à filtrer le contenu des fichiers.
793 795
794\paragraph{head} 796\paragraph{head}\label{ref:head-tail}
795\mintinline{text}|head -<num> fichier| affiche au terminal les 797\mintinline{text}|head -<num> fichier| affiche au terminal les
796\verb|<num>| premières lignes d'un fichier. Sans l'option 798\verb|<num>| premières lignes d'un fichier. Sans l'option
797\mintinline{text}|-<num>|, les 10 premières lignes sont 799\mintinline{text}|-<num>|, les 10 premières lignes sont
@@ -835,4 +837,119 @@ sera ignorée:
8356 8376
836\end{minted} 838\end{minted}
837 839
840\section{Filtrage}
841\label{sec:filtrage}
842
843Comme leur nom l'indique, les commandes de filtrage servent à mettre
844en forme des fichiers texte tout en sélectionnant certaines parties de
845leur contenu.
846
847Nous en avons étudié deux plus haut (\vpageref{ref:head-tail}):
848\begin{enumerate}
849\item \verb|head| qui sélectionne les premières lignes d'un fichier.
850\item \verb|tail| qui sélectionne les dernières lignes d'un fichier.
851\end{enumerate}
852
853On ajoutera ici les commandes suivantes:
854
855\paragraph{cat}
856Affiche au terminal tout le contenu d'un fichier:
857\begin{minted}{text}
858[robert@kiddo courses]$ cat ls-R
859./fichiers/01-ligne-de-commande.tex
860./makefile
861./_preamble.tex
862./README.md
863./README.tex
864\end{minted}
865
866\paragraph{wc}\label{ref:wc}
867Pour \emph{word count}. Cette commande a été utilisée plus haut une
868fois avec l'option \verb|-l| pour compter les lignes d'un fichier
869(\vpageref{ref:wc-intro}). Utilisée sans option, elle retourne le
870nombre de lignes (\verb|-l|), de mots (\verb|-w|) et de caractères
871(\verb|-m|) d'un fichier:
872\begin{minted}{text}
873[robert@kiddo courses]$ wc makefile
874 21 114 627 makefile
875\end{minted}
876
877\paragraph{cut}
878Permet de mettre en forme des données. Prenons l'exemple du fichier
879suivant: \\ \mintinline{text}|etudiants.txt|
880\begin{minted}{text}
881Fonsec Sophie 123456 sophie.fonsec@quelquepart.net
882Pédot Hector 456789 hector.pedot@ailleurs.org
883\end{minted}
884Il contient sur chaque ligne un nom, un prénom, un matricule et une
885adresse email. Nous souhaitons collecter simplement les données
886suivantes:
887\begin{enumerate}
888\item Nom
889\item Prénom
890\item email
891\end{enumerate}
892La commande \verb|cut| peut être utilisée à cet effet avec les deux
893options suivantes:
894\begin{enumerate}
895\item \mintinline{text}|-d| indiquer par quel caractère les données
896 sont délimitées (ici un espace).
897\item \mintinline{text}|-f| (pour \emph{field} en anglais) pour
898 indiquer quelles données doivent être sélectionnées (ici, les
899 éléments 1, puis 2, puis 4).
900\end{enumerate}
901\begin{minted}{text}
902[robert@kiddo courses]$ cut -d ' ' -f 2,1,4 etudiants.txt
903Fonsec Sophie sophie.fonsec@quelquepart.net
904Pédot Hector hector.pedot@ailleurs.org
905\end{minted}
906
907Mais comment faire pour modifier l'ordre des données et les mettre en
908forme de façon à placer le prénom avant le nom et avoir les adresses
909email entre crochets pointus? Comment faire aussi pour récupérer les
910données dans un tableur?
911
912\paragraph{awk}
913Ce programme accessible à la ligne de commande permet d'effectuer ce
914travail facilement. Il sélectionne les données dans l'ordre que l'on
915souhaite à l'aide de variables: \verb|$1|, \verb|$2|, \verb|$3|,
916\&c. Il effectue ensuite ce qu'on appelle des \emph{actions},
917lesquelles sont spécifiées entre accolades \verb|{}|. Nous allons ici
918utiliser l'action \verb|print|. Voici la commande:
919\begin{minted}{text}
920[robert@kiddo courses]$ awk '{print $2 ";" $1 ";<" $4 ">"}' etudiants.txt
921Sophie;Fonsec;<sophie.fonsec@quelquepart.net>
922Hector;Pédot;<hector.pedot@ailleurs.org>
923\end{minted}
924\begin{quoting}
925 \textbf{Commentaire}
926 \begin{enumerate}
927 \item La totalité de l'argument passé à \verb|awk| a été placée
928 entre guillemets simples \verb|' '|. On renvoie sur ce point à la
929 règle posée \vpageref{ref:guillemets-simples-intro}.
930 \item Entre les accolades, l'instruction \verb|print| accomplit
931 successivement les tâches suivantes:
932 \begin{enumerate}
933 \item Impression du champ 2.
934 \item Impression de la chaîne littérale \verb|;| placée entre
935 guillemets\footnote{On n'aurait pas pu employer ici les
936 guillemets simples car le premier guillemet simple aurait
937 évidemment été compris comme le guillemet fermant celui qui se
938 trouve juste avant l'accolade ouvrante.}.
939 \item Impression du champ 1.
940 \item Impression de la chaîne littérale \verb|;<| placée entre
941 guillemets.
942 \item Impression du champ 4.
943 \item Impression de la chaîne littérale \verb|>| placée entre
944 guillemets.
945 \end{enumerate}
946 \end{enumerate}
947\end{quoting}
948Pour terminer, il suffit de renommer le fichier \verb|etudiants.txt|
949en \verb|etudiants.csv| par la commande:
950\begin{minted}{text}
951mv etudiants.txt etudiants.csv
952\end{minted}
953et de l'ouvrir dans LibreOffice Calc.
954
838\end{document} 955\end{document}