diff options
author | Robert Alessi <alessi@robertalessi.net> | 2018-09-16 13:45:37 +0200 |
---|---|---|
committer | Robert Alessi <alessi@robertalessi.net> | 2018-09-16 13:45:37 +0200 |
commit | b48a17d8cbdd7a2017dde05cc0017ad7fcc0d5e9 (patch) | |
tree | c458e458c9ac1cca6ea6c3de510b6836a8a1a1e1 /fichiers | |
parent | f01622e6ff5a96a043fd0d9e0350ba570eb513ee (diff) | |
download | courses-b48a17d8cbdd7a2017dde05cc0017ad7fcc0d5e9.tar.gz |
added fichiers/03-grep-bash.tex
Diffstat (limited to 'fichiers')
-rw-r--r-- | fichiers/03-grep-bash.tex | 185 |
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} | ||
27 | Les 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 | ||
31 | ainsi dire tous les langages de programmation qui permet de construire | ||
32 | des \enquote{modèles}, en anglais \emph{patterns}, susceptibles de | ||
33 | capturer des chaînes de caractères. | ||
34 | |||
35 | Par exemple, soit le fichier suivant: | ||
36 | \begin{minted}{text} | ||
37 | /usr/share/dict/cracklib-small | ||
38 | \end{minted} | ||
39 | Ce fichier fait partie d'un programme dont le rôle est de vérifier la | ||
40 | robustesse des mots de passe. Il contient un grand nombre d'entrées, à | ||
41 | raison d'un mot par ligne. Vérifions cela: | ||
42 | \begin{minted}{text} | ||
43 | [robert@kiddo courses]$ wc -l /usr/share/dict/cracklib-small | ||
44 | 54763 /usr/share/dict/cracklib-small | ||
45 | \end{minted} | ||
46 | L'expression régulière suivante retourne tous les mots de cinq lettres | ||
47 | de ce fichier qui commencent par la lettre \verb|c| et se terminent | ||
48 | par la lettre \verb|h|: | ||
49 | \begin{minted}{text} | ||
50 | [robert@kiddo courses]$ grep '\<c...h\>' /usr/share/dict/cracklib-small | ||
51 | catch | ||
52 | cinch | ||
53 | clash | ||
54 | cloth | ||
55 | coach | ||
56 | conch | ||
57 | couch | ||
58 | cough | ||
59 | crash | ||
60 | crush | ||
61 | czech | ||
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} | ||
71 | Pour construire les modèles (\emph{patterns}), on peut utiliser les | ||
72 | symboles 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 | ||
107 | sous \verb|grep| les metacaractères | ||
108 | \begin{minted}{text} | ||
109 | ? + { } | ( ) | ||
110 | \end{minted} | ||
111 | doivent être précédés de la \emph{séquence d'échappement} \verb|\| | ||
112 | comme ceci: | ||
113 | \begin{minted}{text} | ||
114 | \? \+ \{ \} \| \( \) | ||
115 | \end{minted} | ||
116 | tandis que cela ne se fait pas avec \verb|egrep|. | ||
117 | |||
118 | \paragraph{options} | ||
119 | La commande \verb|(e)grep| peut recevoir un grand nombre | ||
120 | d'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} | ||
134 | Les 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' | ||
138 | scream | ||
139 | seagram | ||
140 | sealteam | ||
141 | seam | ||
142 | sidearm | ||
143 | steam | ||
144 | stream | ||
145 | sunbeam | ||
146 | sunbeam'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 | ||
162 | afoot fleet needn't skeet steep taboo three tweed | ||
163 | beets foote roost sleet steer taboo's three's | ||
164 | boost greet roots sooth stood teems tools | ||
165 | booth hoots scoot steed stool teens tooth | ||
166 | boots loots sheet steel stoop teeth trees | ||
167 | booty 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} | ||