Aller au contenu

grep

Un article de Wikipédia, l'encyclopédie libre.
(Redirigé depuis GNU grep)

Grep

Description de l'image Grep example.png.
Informations
Créateur Ken ThompsonVoir et modifier les données sur Wikidata
Première version Voir et modifier les données sur Wikidata
Système d'exploitation Unix et type UnixVoir et modifier les données sur Wikidata
Type Utilitaire UNIX (d)Voir et modifier les données sur Wikidata

grep est un programme en ligne de commande de recherche de chaînes de caractères, initialement écrit pour UNIX par Ken Thompson, puis amélioré par l'utilisation de l'algorithme d'Aho-Corasick.

Il existe de nombreuses implémentations de grep sur différents systèmes, en particulier sous tous les systèmes de type UNIX. Une des implémentations les plus répandues est GNU grep.

Origine du nom

[modifier | modifier le code]

Historiquement, le nom provient de l'une des commandes de l'éditeur de texte ed disponible sur UNIX, dont la syntaxe est :

:g/re/p

Cette commande signifie : « rechercher globalement les correspondances avec l'expression rationnelle (en anglais, regular expression), et imprimer (print) les lignes dans lesquelles elle correspond ». Par défaut, grep se comporte très exactement comme cette commande. Toutefois, de nombreuses options en ligne de commande permettent de changer son comportement[1].

Caractéristiques techniques

[modifier | modifier le code]

Le comportement habituel de grep est de recevoir une expression rationnelle en argument, de lire les données sur l'entrée standard ou dans une liste de fichiers, et d'écrire les lignes qui contiennent des correspondances avec l'expression rationnelle sur la sortie standard.

Par exemple, grep permet de chercher les lignes contenant le nom Durand dans un fichier de contacts téléphoniques :

$ grep Durand ListeNuméros.txt

ne renverra que les lignes contenant Durand :

 Guénolé Durand, 0723237694
 Bernard Durand, 0966324355

grep est un filtre, ce qui lui permet d'être combiné avec d'autres commandes, sous la forme d'un pipeline.

Ses performances et sa facilité d'emploi en font un outil adapté pour rechercher efficacement des chaînes dans une arborescence complexe de fichiers. Il est par exemple utilisé pour trouver toutes les occurrences du nom d'une fonction dans le code source d'un programme ou de chaînes dans des fichiers de configuration. Malgré la présence de fonctionnalités similaires dans de nombreux programmes, comme Emacs ou vi, de nombreux utilisateurs préfèrent utiliser directement grep, même lorsqu'ils sont en train d'utiliser ces programmes.

La commande grep est limitée à certains aspects des caractères. Par exemple, elle ne permet pas de faire des recherches dans des fichiers encodés en UTF-16. Les recherches sont cependant possibles si le fichier a préalablement été converti au format UTF-8. La prise en charge du format UTF-8 ne se fait cependant qu'en considérant chaque caractère comme une séquence d'octets.

Il existe de nombreux dérivés de grep. Parmi eux :

  • agrep, pour approximate grep, c'est-à-dire grep approximatif, qui facilite la recherche de chaînes approchées ;
  • fgrep, (équivalent à grep -F) pour des recherches de texte brut (sans expressions régulières)[2] ;
  • egrep, (équivalent à grep -E) pour les recherches nécessitant une syntaxe d'expressions rationnelles plus sophistiquée (expressions rationnelles étendues)[2] ;
  • rgrep, (équivalent à grep -r) pour une recherche dans tous les fichiers d'un répertoire récursivement[2] ;
  • zgrep, pour une recherche dans un ou des fichiers compressés ;
  • tcgrep, (semblable à mais différent de grep -P)[3] qui est une réécriture de grep et qui utilise les expressions rationnelles de Perl.

A noter que grep egrep fgrep et rgrep étaient distribuées en plusieurs fichiers binaires séparées sur certaines versions d'Unix, c'est pourquoi elles sont encore souvent accessibles. Mais en réalité, elles ont aujourd'hui exactement les mêmes effets que les différentes options de grep[2].

La plupart de ces variantes de grep ont été portées sur de nombreux systèmes d'exploitation. On parle alors d'implémentation moderne de grep.

De nombreuses autres commandes contiennent le mot « grep ». Par exemple, l'utilitaire pgrep affiche le numéro des processus dont le nom correspond à l'expression rationnelle.

Implémentations

[modifier | modifier le code]

GNU grep est l'implémentation de la commande UNIX grep par le projet GNU lancé par Richard Stallman dans les années 1980 [4]. C'est un logiciel libre distribué selon les termes de la licence publique générale GNU.

La commande grep est initialement écrite pour UNIX par Ken Thompson. Dans le cadre du projet GNU, Mike Haerkal[5], implémentera grep en logiciel libre avant la fin des années 1980 [6].

L'implémentation grep du projet GNU est aujourd'hui largement utilisée, par les systèmes Linux, FreeBSD, mais aussi Mac OS X.

Utilisation dans la langue courante

[modifier | modifier le code]

En tant qu'acronyme, « grep » est un mot prononçable, en français comme en anglais. Les utilisateurs anglophones de grep utilisent souvent son nom comme un verbe, qui signifie « chercher quelque chose dans un fichier », comme on le ferait avec l'utilitaire grep. L'objet direct désigne alors les fichiers dans lesquels il faut chercher : « Kibo grepped his Usenet spool for his name. » (qui signifie : « Kibo a recherché son nom dans son spool Usenet. »). En français, le mot est plus rarement utilisé comme un verbe du premier groupe : « greppe les logs pour voir si le serveur a reçu ta demande. »

Par extension, le mot « grep » est aussi devenu un synonyme des expressions rationnelles elles-mêmes. De nombreux éditeurs ou traitements de texte proposent aujourd'hui des fonctionnalités de recherche à l'aide d'expressions rationnelles, qu'ils désignent souvent par « outil grep » ou « mode grep », dans lequel des motifs grep peuvent être saisis. Cette imprécision est source de confusion, en particulier dans les environnements non-UNIX.

Équivalents

[modifier | modifier le code]

Équivalent de grep sous Windows : la commande findstr

[modifier | modifier le code]

La commande findstr de Windows est en fait un QGrep, un GREP adapté à windows. Il prend en charge les expressions régulières mais sa syntaxe diffère légèrement de grep.

Pour disposer du même grep sous Windows, il faut soit installer cygwin ou plus simplement le grep du projet GnuWin32[7]. On peut également trouver une version adaptée sur le site de Tim Charron (voir les liens externes plus bas).

Équivalent de grep sous IOS : la commande include

[modifier | modifier le code]

La commande include de Cisco IOS réalise les fonctions les plus basiques de grep. Par exemple, la commande show running-config | include 192.168.1.1 affichera les lignes de la configuration active qui contiennent l'adresse 192.168.1.1.

Ack, grep pour programmeurs

[modifier | modifier le code]

ack, écrit en Perl, est un logiciel défini comme « ack, mieux que grep, un outil de recherche puissant pour programmeurs »[8] :

Articles connexes

[modifier | modifier le code]

Liens externes

[modifier | modifier le code]

Références

[modifier | modifier le code]
  1. Computerphile, « Where GREP Came From - Computerphile », (consulté le )
  2. a b c et d « regular expression - What is the difference between `grep`, `egrep`, and `fgrep`? », sur Unix & Linux Stack Exchange (consulté le )
  3. Manuel de grep
    -P, --perl-regexp
        Interpret PATTERN as a Perl regular expression. This is highly experimental and grep -P may warn of unimplemented features.
    
  4. (en) Thomas Lord, ancien hacker du projet GNU et employé à l'origine par la FSF cite l'implémentation en logiciel libre de grep comme tâche prioritaire du projet ( O'Reilly Broadcast, le 27 avril 2009).
  5. (en) Message sur la liste email de freebsd, de Mike Haertel expliquant pourquoi GNU grep est rapide ( Liste email freebsd, le 21 août 2010 ).
  6. (en) Le bulletin GNU de Janvier 1987, section "Statut du projet GNU", cite grep dans les outils disponible ( Bulletin Gnu , le 3 janvier 1987).
  7. (en) L'utilitaire Grep du projet GnuWin32.
  8. (en) ack, un grep pour les programmeurs.