web-dev-qa-db-fra.com

Comment fonctionne cette expression de parenthèse dans grep?

J'ai vu ce one-liner récemment:

$ ps -ef | grep [f]irefox 

thorsen   16730     1  1 Jun19 ?        00:27:27 /usr/lib/firefox/firefox ...

Donc, il semble retourner la liste des processus avec "firefox" dans les données mais en laissant de côté le processus grep lui-même, et semble donc à peu près équivalent à:

ps -ef |grep -v grep| grep firefox

Je ne comprends pas comment ça marche. J'ai consulté la page de manuel sur grep et ailleurs, mais je n'ai trouvé aucune explication.

Et pour composer le mystère si je cours:

$ ps -ef | grep firefox  > data
$ grep [f]irefox data

thorsen   15820 28618  0 07:28 pts/1    00:00:00 grep --color=auto firefox
thorsen   16730     1  1 Jun19 ?        00:27:45 /usr/lib/firefox/firefox ....

le [t] rick semble cesser de fonctionner!

Quelqu'un ici saura ce qui se passe, j'en suis sûr.

Merci.

38
Thorsen

L’expression des crochets fait partie de la bash Shell (et d'autres coquilles aussi) correspondance de modèle de classe de caractères de grep.

Le programme grep comprend par défaut les expressions rationnelles POSIX de base. Avec cela, vous pouvez définir des classes de caractères. Par exemple, ps -ef | grep [ab9]irefox trouverait "uneirefox ","birefox ","9irefox "si ceux-ci existaient, mais pas"un Birefox ".

La commande grep [a-zA-Z0-9]irefox trouverait même tous les processus commençant par une lettre ou un chiffre et se terminant par "irefox".

Donc, ps -ef | grep firefox recherche les lignes contenant firefox. Puisque le processus grep lui-même contient "firefox", grep le trouve également. En ajoutant un [], nous recherchons uniquement la classe de caractères "[f]" (constituée uniquement de la lettre "f" et qui est donc équivalente à un "f" sans les crochets). L'avantage des crochets est que la chaîne "firefox" n'apparaît plus dans la commande grep. Par conséquent, grep lui-même n'apparaîtra pas dans le résultat de grep.

Comme peu de gens connaissent les crochets comme correspondance de classe de caractères et expressions régulières en général, le second résultat peut paraître un peu mystérieux.

Si vous voulez corriger le deuxième résultat, vous pouvez les utiliser de cette façon:

ps -ef | grep [f]irefox  > data
grep firefox data

(Référence)

56
jokerdino

La raison est que la chaîne

grep firefox

correspond au modèle firefoxname__, mais la chaîne

grep [f]irefox

ne correspond pas au modèle [f]irefox (qui correspond au modèle firefoxname__).

C'est pourquoi le premier grep correspond à sa propre ligne de commande de processus, contrairement au second.

10
Daniel Hershcovich