From b48a17d8cbdd7a2017dde05cc0017ad7fcc0d5e9 Mon Sep 17 00:00:00 2001 From: Robert Alessi 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') 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 '\' /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 '\' | 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