aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Alessi <alessi@robertalessi.net>2018-09-16 13:45:37 +0200
committerRobert Alessi <alessi@robertalessi.net>2018-09-16 13:45:37 +0200
commitb48a17d8cbdd7a2017dde05cc0017ad7fcc0d5e9 (patch)
treec458e458c9ac1cca6ea6c3de510b6836a8a1a1e1
parentf01622e6ff5a96a043fd0d9e0350ba570eb513ee (diff)
downloadcourses-b48a17d8cbdd7a2017dde05cc0017ad7fcc0d5e9.tar.gz
added fichiers/03-grep-bash.tex
-rw-r--r--fichiers/03-grep-bash.tex185
1 files changed, 185 insertions, 0 deletions
diff --git a/fichiers/03-grep-bash.tex b/fichiers/03-grep-bash.tex
new file mode 100644
index 0000000..21ed846
--- /dev/null
+++ b/fichiers/03-grep-bash.tex
@@ -0,0 +1,185 @@
1\input{../_preamble}
2\usepackage{menukeys}
3\title{grep et bash}
4\usepackage{units}
5\usepackage{cleveref}
6\usepackage{booktabs}
7\usepackage{xltabular}
8\usepackage{dingbat}
9\usepackage{mdframed}
10\mdfsetup{
11 backgroundcolor=Lavender,
12 hidealllines=true}
13\usepackage{minted}
14\surroundwithmdframed{minted}
15\setminted{
16 breaklines,
17 breaksymbolright=\small\carriagereturn}
18\setmintedinline{bgcolor=Lavender}
19\usepackage{soul}
20\begin{document}
21\maketitle
22\renewcommand{\contentsname}{Sommaire}
23\tableofcontents
24
25\chapter{grep, les expressions régulières}
26\label{cha:grep-les-expressions}
27Les expressions régulières se rapprochent des \emph{wildcards} ou
28\enquote{métacaractères} qui ont été présentés dans
29\href{https://notabug.org/ralessi/courses/src/master/fichiers/01-ligne-de-commande.tex#L709}{le
30 cours sur la ligne de commande}. C'est une technique commune à pour
31ainsi dire tous les langages de programmation qui permet de construire
32des \enquote{modèles}, en anglais \emph{patterns}, susceptibles de
33capturer des chaînes de caractères.
34
35Par exemple, soit le fichier suivant:
36\begin{minted}{text}
37/usr/share/dict/cracklib-small
38\end{minted}
39Ce fichier fait partie d'un programme dont le rôle est de vérifier la
40robustesse des mots de passe. Il contient un grand nombre d'entrées, à
41raison d'un mot par ligne. Vérifions cela:
42\begin{minted}{text}
43[robert@kiddo courses]$ wc -l /usr/share/dict/cracklib-small
4454763 /usr/share/dict/cracklib-small
45\end{minted}
46L'expression régulière suivante retourne tous les mots de cinq lettres
47de ce fichier qui commencent par la lettre \verb|c| et se terminent
48par la lettre \verb|h|:
49\begin{minted}{text}
50[robert@kiddo courses]$ grep '\<c...h\>' /usr/share/dict/cracklib-small
51catch
52cinch
53clash
54cloth
55coach
56conch
57couch
58cough
59crash
60crush
61czech
62\end{minted}
63
64\begin{quoting}
65 \textsc{Rem.} \verb|grep| recherche les modèles ligne par
66 ligne et retourne donc un résultat positif dès lors qu'un modèle
67 donné a été trouvé au moins une fois dans une ligne.
68\end{quoting}
69
70\paragraph{Modèles}
71Pour construire les modèles (\emph{patterns}), on peut utiliser les
72symboles suivants\footnote{Cette liste n'est pas exhaustive.}:
73\begin{xltabular}{\linewidth}{lX}
74 \toprule
75 Symbole & Signification \\ \midrule\endhead
76 \verb|.| & tout caractère unique\\
77 \verb|?| & le caractère précédent est répété 0 ou une fois\\
78 \verb|*| & le caractère précédent est répété 0 fois ou autant
79 de fois que possible\\
80 \verb|+| & le caractère précédent est répété une fois \emph{au
81 moins}\\
82 \verb|{n}| & le caractère précédent est répété exactement \emph{n}
83 fois\\
84 \verb|{n,m}| & le caractère précédent est répété au moins \emph{n}
85 fois et au plus \emph{m} fois\\
86 \verb|[abc]| & le caractère précédent est l'un de ceux qui se
87 trouvent entre les crochets droits\\
88 \verb|[^abc]| & le caractère précédent n'est pas l'un de ceux qui se
89 trouvent entre les crochets droits\\
90 \verb|[a-z]| & le caractère précédent est compris entre \emph{a} et
91 \emph{z}, dans l'ordre de la table des caractères \\
92 \verb|()| & ce qui est inclus entre les parenthèses est traité comme
93 un groupe \\
94
95 \verb+|+ & opérateur logique signifiant \emph{ou} \\
96 \verb|^| & représente le début de la ligne\\
97 \verb|$| & représente la fin de la ligne\\ \\
98 \verb|\<| et \verb|\>| & représentent respectivement un début et une
99 fin de mot\\
100 \bottomrule
101\end{xltabular}
102
103\paragraph{grep, egrep}
104À la place de \verb|grep|, on peut saisir à la ligne de commande
105\verb|egrep| ou \verb|grep -E| pour \emph{extended regular
106 expressions}. Quelle est la différence? Retenez ici simplement que
107sous \verb|grep| les metacaractères
108\begin{minted}{text}
109? + { } | ( )
110\end{minted}
111doivent être précédés de la \emph{séquence d'échappement} \verb|\|
112comme ceci:
113\begin{minted}{text}
114\? \+ \{ \} \| \( \)
115\end{minted}
116tandis que cela ne se fait pas avec \verb|egrep|.
117
118\paragraph{options}
119La commande \verb|(e)grep| peut recevoir un grand nombre
120d'options. Parmi ces options, retenons celles-ci:
121\begin{description}
122\item[-n] retourne les numéros des lignes dans lesquelles le modèle de
123 recherche a été trouvé.
124\item[-c] retourne le nombre d'occurrences trouvées.
125\item[-i] demande à \verb|grep| de ne pas faire de différence entre
126 les minuscules et les majuscules.
127\item[-H] retourne le nom du fichier dans lequel le modèle recherché
128 est trouvé.
129\item[-v] \emph{nie} le modèle recherché: \verb|grep| retournera donc
130 les lignes dans lesquelles le modèle \emph{n'a pas été trouvé}.
131\end{description}
132
133\paragraph{Exemples}
134Les exemples ci-dessous utilisent \href{https://notabug.org/ralessi/courses/src/master/fichiers/01-ligne-de-commande.tex#L732}{la
135 technique de la redirection}.
136\begin{minted}{text}
137[robert@kiddo courses]$ cat /usr/share/dict/cracklib-small | grep '\<s.*m\>' | grep 'ea'
138scream
139seagram
140sealteam
141seam
142sidearm
143steam
144stream
145sunbeam
146sunbeam's
147\end{minted}
148 \begin{quoting}
149 \textbf{Commentaire:} La ligne de commande fait ici successivement
150 les opérations suivantes:
151 \begin{enumerate}
152 \item Concaténation de toutes les lignes du fichier
153 \verb|cracklib-small|
154 \item Sélection de tous les mots qui commencent par la lettre
155 \verb|s| et se terminent par la lettre \verb|m|.
156 \item Parmi ces mots, sélection de ceux qui contiennent la chaîne
157 \verb|ea|.
158 \end{enumerate}
159 \end{quoting}
160\begin{minted}{text}
161[robert@kiddo courses]$ cat /usr/share/dict/cracklib-small | grep '\<.....\>' | grep -E 'o{2}|e{2}' | grep 't' | column -c 70
162afoot fleet needn't skeet steep taboo three tweed
163beets foote roost sleet steer taboo's three's
164boost greet roots sooth stood teems tools
165booth hoots scoot steed stool teens tooth
166boots loots sheet steel stoop teeth trees
167booty meets shoot steen sweet tepee troop
168\end{minted}
169\begin{quoting}
170 \textbf{Commentaire:} La ligne de commande fait ici successivement
171 les opérations suivantes:
172 \begin{enumerate}
173 \item Concaténation de toutes les lignes du fichier
174 \verb|cracklib-small|
175 \item Sélection des mots de cinq caractères.
176 \item Parmi ces mots, sélection de ceux qui contiennent \emph{soit}
177 la chaîne \verb|oo| \emph{soit} la chaîne \verb|ee|.
178 \item Enfin, sélection, parmi ces derniers mots, de ceux qui
179 contiennent la lettre \verb|t|
180 \item La dernière ligne, dont on n'a pas étudié la syntaxe, demande
181 l'affichage du résultat sous la forme de colonnes tabulées.
182 \end{enumerate}
183\end{quoting}
184
185\end{document}