From b48a17d8cbdd7a2017dde05cc0017ad7fcc0d5e9 Mon Sep 17 00:00:00 2001
From: Robert Alessi <alessi@robertalessi.net>
Date: Sun, 16 Sep 2018 13:45:37 +0200
Subject: added fichiers/03-grep-bash.tex

---
 fichiers/03-grep-bash.tex | 185 ++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 185 insertions(+)
 create mode 100644 fichiers/03-grep-bash.tex

(limited to 'fichiers/03-grep-bash.tex')

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 @@
+\input{../_preamble}
+\usepackage{menukeys}
+\title{grep et bash}
+\usepackage{units}
+\usepackage{cleveref}
+\usepackage{booktabs}
+\usepackage{xltabular}
+\usepackage{dingbat}
+\usepackage{mdframed}
+\mdfsetup{
+  backgroundcolor=Lavender,
+  hidealllines=true}
+\usepackage{minted}
+\surroundwithmdframed{minted}
+\setminted{
+  breaklines,
+  breaksymbolright=\small\carriagereturn}
+\setmintedinline{bgcolor=Lavender}
+\usepackage{soul}
+\begin{document}
+\maketitle
+\renewcommand{\contentsname}{Sommaire}
+\tableofcontents
+
+\chapter{grep, les expressions régulières}
+\label{cha:grep-les-expressions}
+Les expressions régulières se rapprochent des \emph{wildcards} ou
+\enquote{métacaractères} qui ont été présentés dans
+\href{https://notabug.org/ralessi/courses/src/master/fichiers/01-ligne-de-commande.tex#L709}{le
+  cours sur la ligne de commande}. C'est une technique commune à pour
+ainsi dire tous les langages de programmation qui permet de construire
+des \enquote{modèles}, en anglais \emph{patterns}, susceptibles de
+capturer des chaînes de caractères.
+
+Par exemple, soit le fichier suivant:
+\begin{minted}{text}
+/usr/share/dict/cracklib-small
+\end{minted}
+Ce fichier fait partie d'un programme dont le rôle est de vérifier la
+robustesse des mots de passe. Il contient un grand nombre d'entrées, à
+raison d'un mot par ligne. Vérifions cela:
+\begin{minted}{text}
+[robert@kiddo courses]$ wc -l /usr/share/dict/cracklib-small 
+54763 /usr/share/dict/cracklib-small
+\end{minted}
+L'expression régulière suivante retourne tous les mots de cinq lettres
+de ce fichier qui commencent par la lettre \verb|c| et se terminent
+par la lettre \verb|h|:
+\begin{minted}{text}
+[robert@kiddo courses]$ grep '\<c...h\>' /usr/share/dict/cracklib-small
+catch
+cinch
+clash
+cloth
+coach
+conch
+couch
+cough
+crash
+crush
+czech
+\end{minted}
+
+\begin{quoting}
+  \textsc{Rem.} \verb|grep| recherche les modèles ligne par
+  ligne et retourne donc un résultat positif dès lors qu'un modèle
+  donné a été trouvé au moins une fois dans une ligne.
+\end{quoting}
+
+\paragraph{Modèles}
+Pour construire les modèles (\emph{patterns}), on peut utiliser les
+symboles suivants\footnote{Cette liste n'est pas exhaustive.}:
+\begin{xltabular}{\linewidth}{lX}
+  \toprule
+  Symbole & Signification \\ \midrule\endhead
+  \verb|.| & tout caractère unique\\
+  \verb|?| & le caractère précédent est répété 0 ou une fois\\
+  \verb|*| & le caractère précédent est répété 0 fois ou autant
+             de fois que possible\\
+  \verb|+| & le caractère précédent est répété une fois \emph{au
+             moins}\\
+  \verb|{n}| & le caractère précédent est répété exactement \emph{n}
+               fois\\
+  \verb|{n,m}| & le caractère précédent est répété au moins \emph{n}
+                 fois et au plus \emph{m} fois\\
+  \verb|[abc]| & le caractère précédent est l'un de ceux qui se
+                 trouvent entre les crochets droits\\
+  \verb|[^abc]| & le caractère précédent n'est pas l'un de ceux qui se
+                  trouvent entre les crochets droits\\
+  \verb|[a-z]| & le caractère précédent est compris entre \emph{a} et
+                 \emph{z}, dans l'ordre de la table des caractères \\
+  \verb|()| & ce qui est inclus entre les parenthèses est traité comme
+              un groupe \\
+  
+  \verb+|+ & opérateur logique signifiant \emph{ou} \\
+  \verb|^| & représente le début de la ligne\\
+  \verb|$| & représente la fin de la ligne\\ \\
+  \verb|\<| et \verb|\>| & représentent respectivement un début et une
+                           fin de mot\\
+  \bottomrule
+\end{xltabular}
+
+\paragraph{grep, egrep}
+À la place de \verb|grep|, on peut saisir à la ligne de commande
+\verb|egrep| ou \verb|grep -E| pour \emph{extended regular
+  expressions}. Quelle est la différence? Retenez ici simplement que
+sous \verb|grep| les metacaractères
+\begin{minted}{text}
+? + { } | ( )
+\end{minted}
+doivent être précédés de la \emph{séquence d'échappement} \verb|\|
+comme ceci:
+\begin{minted}{text}
+\? \+ \{ \} \| \( \)
+\end{minted}
+tandis que cela ne se fait pas avec \verb|egrep|.
+
+\paragraph{options}
+La commande \verb|(e)grep| peut recevoir un grand nombre
+d'options. Parmi ces options, retenons celles-ci:
+\begin{description}
+\item[-n] retourne les numéros des lignes dans lesquelles le modèle de
+  recherche a été trouvé.
+\item[-c] retourne le nombre d'occurrences trouvées.
+\item[-i] demande à \verb|grep| de ne pas faire de différence entre
+  les minuscules et les majuscules.
+\item[-H] retourne le nom du fichier dans lequel le modèle recherché
+  est trouvé.
+\item[-v] \emph{nie} le modèle recherché: \verb|grep| retournera donc
+  les lignes dans lesquelles le modèle \emph{n'a pas été trouvé}. 
+\end{description}
+
+\paragraph{Exemples}
+Les exemples ci-dessous utilisent \href{https://notabug.org/ralessi/courses/src/master/fichiers/01-ligne-de-commande.tex#L732}{la
+    technique de la redirection}.
+\begin{minted}{text}
+[robert@kiddo courses]$ cat /usr/share/dict/cracklib-small | grep '\<s.*m\>' | grep 'ea'
+scream
+seagram
+sealteam
+seam
+sidearm
+steam
+stream
+sunbeam
+sunbeam's
+\end{minted}
+  \begin{quoting}
+    \textbf{Commentaire:} La ligne de commande fait ici successivement
+  les opérations suivantes:
+    \begin{enumerate}
+    \item Concaténation de toutes les lignes du fichier
+      \verb|cracklib-small|
+    \item Sélection de tous les mots qui commencent par la lettre
+      \verb|s| et se terminent par la lettre \verb|m|.
+    \item Parmi ces mots, sélection de ceux qui contiennent la chaîne
+      \verb|ea|.
+    \end{enumerate}
+  \end{quoting}
+\begin{minted}{text}
+[robert@kiddo courses]$ cat /usr/share/dict/cracklib-small | grep '\<.....\>' | grep -E 'o{2}|e{2}' | grep 't' | column -c 70
+afoot   fleet   needn't skeet   steep   taboo   three   tweed
+beets   foote   roost   sleet   steer   taboo's three's
+boost   greet   roots   sooth   stood   teems   tools
+booth   hoots   scoot   steed   stool   teens   tooth
+boots   loots   sheet   steel   stoop   teeth   trees
+booty   meets   shoot   steen   sweet   tepee   troop
+\end{minted}
+\begin{quoting}
+  \textbf{Commentaire:} La ligne de commande fait ici successivement
+  les opérations suivantes:
+  \begin{enumerate}
+  \item Concaténation de toutes les lignes du fichier
+    \verb|cracklib-small|
+  \item Sélection des mots de cinq caractères.
+  \item Parmi ces mots, sélection de ceux qui contiennent \emph{soit}
+    la chaîne \verb|oo| \emph{soit} la chaîne \verb|ee|.
+  \item Enfin, sélection, parmi ces derniers mots, de ceux qui
+    contiennent la lettre \verb|t|
+  \item La dernière ligne, dont on n'a pas étudié la syntaxe, demande
+    l'affichage du résultat sous la forme de colonnes tabulées.
+  \end{enumerate}
+\end{quoting}
+
+\end{document}
-- 
cgit v1.2.3

