Dominique Meeùs
Dernière modification le   
retour à la table des matières — à l’index — à ma page de départ

Rechercher du texte ou une expression régulière dans une ligne
(grep)

Up: Rechercher des fichiers ou des fragments de texte dans des fichiers ou les lire Previous: Rechercher des fichiers dans une arborescence (find ou locate, aussi fdupes) Next: Lire du texte dans un fichier (cat, antiword, catdoc, more, less, head, tail et même sed)

La commande grep cherche dans un fichier les lignes contenant un certain motif (pattern) donné par une expression régulière. Par exemple, avec

grep "/Aug/2007:" temp-000000.log > 200708access.log

je sélectionne dans un très long journal de mon site les lignes concernant août 2007 et j’en tire le journal d’août. Attention si on cherche un texte qui serait trompeur en tant qu’expression régulière ; par grep -F "some string", on peut indiquer à grep qu’il ne s’agit que de texte ordinaire, même s’il contient des signes cabalistiques. On peut chercher dans tous les fichiers d’un répertoire et de ses sous-répertoires avec grep -r "pattern" path. Il faut absolument un chemin explicite, donc au moins grep -r "pattern" . où le point indique le répertoire courant. On peut limiter à un type de fichier par--include (en n’oubliant pas le point du répertoire courant, ou un autre dossier) :

grep -rF "some string" . --include="*.xml"

La commande grep accepte un joker dans le nom de fichier et l’omission du répertoire si on cherche seulement dans le répertoire courant. On peut donc écrire grep "string" *.xml, tandis qu’avec presque la même chose grep -r "string" *.xml pour le même répertoire courant (mais avec les sous-répertoires en plus), on est surpris de voir que ça ne marche pas. Il faut comme ci-dessus expliciter le répertoire, même le répertoire courant, et utiliser alors --include pour spécifier s’il y a lieu les fichiers.

Si la chaîne contient des signes double quote, il faut les échapper 13 par une barre inversée. Mais on peut aussi utiliser le signe simple quote pour délimiter toute la chaine et imposer une interprétation littérale de son contenu. Par exemple, pour chercher une valeur d’attribut, on pourrait faire :

grep -rF 'list rend="horiz"' . --include="*.xml"

Par défaut, grep retourne les lignes qui contiennent l’expression recherchée (en mentionnant le fichier). Mais avec grep -l, on a seulement la liste des fichiers qui contiennent l’expression recherchée. Avec grep -L, on a le contraire : la liste des fichiers qui ne contiennent pas l’expression recherchée.

Loook, programme La commande grep ne cherche que dans les fichiers texte. La commande pdfgrep fait la même chose dans les PDF (qui contiennent du texte en plus de l’image) et le programme (GUI) Loook peut le faire dans les fichiers en Open Document Format (ODF, comme .odt .ods…) de LibreOffice et autres. C’est évidemment très précieux. On n’écrit pas seulement en HTML et si on se dit : « dans quel fichier parle-t-on de cela ? dans quel fichier ai-je écrit cela ?… », les pdfgrep et Loook sont indispensables. On trouve Loook en paquet Debian.

Notes
Up: Rechercher des fichiers ou des fragments de texte dans des fichiers ou les lire Previous: Rechercher des fichiers dans une arborescence (find ou locate, aussi fdupes) Next: Lire du texte dans un fichier (cat, antiword, catdoc, more, less, head, tail et même sed)