diff options
author | Robert Alessi <alessi@robertalessi.net> | 2018-09-14 13:58:46 +0200 |
---|---|---|
committer | Robert Alessi <alessi@robertalessi.net> | 2018-09-14 13:58:46 +0200 |
commit | 549c3929b88a8f5bd223e60055ea20d7788ecb60 (patch) | |
tree | 137194b357e458cdd6a7fa6c70fd9d0cb8facd80 | |
parent | 08bebf4f035ed688bbfabf1b92c29ad7534d92d9 (diff) | |
download | courses-549c3929b88a8f5bd223e60055ea20d7788ecb60.tar.gz |
added a section on filters
-rw-r--r-- | fichiers/01-ligne-de-commande.tex | 133 |
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} |
580 | Et le \emph{shell} ne pourra pas le trouver. Il y a deux solutions | 580 | Et le \emph{shell} ne pourra pas le trouver. Il y a deux solutions |
581 | possibles: | 581 | possibles: |
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 | |||
706 | que les fichiers cachés du répertoire courant dont le nom commence | 706 | que les fichiers cachés du répertoire courant dont le nom commence |
707 | par un point. | 707 | par un point. |
708 | 708 | ||
709 | \subsection{Wildcards} | 709 | \section{Wildcards} |
710 | \label{sec:wildcards} | 710 | \label{sec:wildcards} |
711 | Les \emph{wildcards}, ou \enquote{métacaractères} sont des caractères | 711 | Les \emph{wildcards}, ou \enquote{métacaractères} sont des caractères |
712 | ou des séquences de caractères qui servent à représenter des séries de | 712 | ou 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} |
734 | Nous avons vu jusqu'ici que les commandes renvoient normalement leur | 734 | Nous avons vu jusqu'ici que les commandes renvoient normalement leur |
735 | résultat sur le terminal lui-même. On peut cependant rediriger ce que | 735 | 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 | |||
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 |
752 | sont entrées aux lignes 1, 2 et 4: | 752 | sont 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}| |
758 | total 24 | 758 | total 24 |
759 | drwxr-xr-x 3 robert robert 4096 13 sept. 17:15 fichiers | 759 | drwxr-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} | ||
767 | L'exemple suivant est plus subtil. Il fait appel à une commande, | 768 | L'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 |
771 | 21 makefile | 773 | 21 makefile |
@@ -791,7 +793,7 @@ caractère \emph{pipe} (\verb+|+). | |||
791 | Avant d'aller plus loin, étudions rapidement deux nouvelles commandes | 793 | Avant d'aller plus loin, étudions rapidement deux nouvelles commandes |
792 | qui servent à filtrer le contenu des fichiers. | 794 | qui 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: | |||
835 | 6 | 837 | 6 |
836 | \end{minted} | 838 | \end{minted} |
837 | 839 | ||
840 | \section{Filtrage} | ||
841 | \label{sec:filtrage} | ||
842 | |||
843 | Comme leur nom l'indique, les commandes de filtrage servent à mettre | ||
844 | en forme des fichiers texte tout en sélectionnant certaines parties de | ||
845 | leur contenu. | ||
846 | |||
847 | Nous 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 | |||
853 | On ajoutera ici les commandes suivantes: | ||
854 | |||
855 | \paragraph{cat} | ||
856 | Affiche 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} | ||
867 | Pour \emph{word count}. Cette commande a été utilisée plus haut une | ||
868 | fois avec l'option \verb|-l| pour compter les lignes d'un fichier | ||
869 | (\vpageref{ref:wc-intro}). Utilisée sans option, elle retourne le | ||
870 | nombre 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} | ||
878 | Permet de mettre en forme des données. Prenons l'exemple du fichier | ||
879 | suivant: \\ \mintinline{text}|etudiants.txt| | ||
880 | \begin{minted}{text} | ||
881 | Fonsec Sophie 123456 sophie.fonsec@quelquepart.net | ||
882 | Pédot Hector 456789 hector.pedot@ailleurs.org | ||
883 | \end{minted} | ||
884 | Il contient sur chaque ligne un nom, un prénom, un matricule et une | ||
885 | adresse email. Nous souhaitons collecter simplement les données | ||
886 | suivantes: | ||
887 | \begin{enumerate} | ||
888 | \item Nom | ||
889 | \item Prénom | ||
890 | \item email | ||
891 | \end{enumerate} | ||
892 | La commande \verb|cut| peut être utilisée à cet effet avec les deux | ||
893 | options 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 | ||
903 | Fonsec Sophie sophie.fonsec@quelquepart.net | ||
904 | Pédot Hector hector.pedot@ailleurs.org | ||
905 | \end{minted} | ||
906 | |||
907 | Mais comment faire pour modifier l'ordre des données et les mettre en | ||
908 | forme de façon à placer le prénom avant le nom et avoir les adresses | ||
909 | email entre crochets pointus? Comment faire aussi pour récupérer les | ||
910 | données dans un tableur? | ||
911 | |||
912 | \paragraph{awk} | ||
913 | Ce programme accessible à la ligne de commande permet d'effectuer ce | ||
914 | travail facilement. Il sélectionne les données dans l'ordre que l'on | ||
915 | souhaite à l'aide de variables: \verb|$1|, \verb|$2|, \verb|$3|, | ||
916 | \&c. Il effectue ensuite ce qu'on appelle des \emph{actions}, | ||
917 | lesquelles sont spécifiées entre accolades \verb|{}|. Nous allons ici | ||
918 | utiliser l'action \verb|print|. Voici la commande: | ||
919 | \begin{minted}{text} | ||
920 | [robert@kiddo courses]$ awk '{print $2 ";" $1 ";<" $4 ">"}' etudiants.txt | ||
921 | Sophie;Fonsec;<sophie.fonsec@quelquepart.net> | ||
922 | Hector;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} | ||
948 | Pour terminer, il suffit de renommer le fichier \verb|etudiants.txt| | ||
949 | en \verb|etudiants.csv| par la commande: | ||
950 | \begin{minted}{text} | ||
951 | mv etudiants.txt etudiants.csv | ||
952 | \end{minted} | ||
953 | et de l'ouvrir dans LibreOffice Calc. | ||
954 | |||
838 | \end{document} | 955 | \end{document} |