Comment fonctionne cette expression [t] ricky dans grep?

31

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

$ ps -ef | grep [f]irefox 

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

Il semble donc que la liste des processus avec "firefox" soit retournée 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 peux pas comprendre comment ça marche si. J'ai regardé la page de manuel sur grep et ailleurs mais je n'ai pas trouvé d'explication.

Et aggraver 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.

Merci.

    
posée Thorsen 20.06.2012 - 08:46
la source

2 réponses

47

L'expression entre crochets fait partie du shell shell bash (et d'autres shells également) correspondant à la classe de caractères de grep.

Le programme grep par défaut comprend les expressions régulières de base POSIX. Avec cela, vous pouvez définir des classes de caractères. Par exemple, ps -ef | grep [ab9]irefox trouverait " a irefox", " b irefox", " 9 irefix" si elles existaient, mais pas "< b> ab irefox ".

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 avec firefox . Puisque le processus de grep lui-même contient "firefox", grep le trouve également. En ajoutant un [] , nous recherchons uniquement la classe de caractères "[f]" (qui ne comprend que la lettre "f" et est donc équivalente à un simple "f" sans les crochets). L'avantage des parenthèses maintenant 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.

Etant donné que peu de gens sont familiers avec les crochets en tant que correspondance de classes de caractères et en général d’expressions régulières, le deuxième résultat peut paraître un peu mystérieux.

Si vous souhaitez corriger le deuxième résultat, vous pouvez les utiliser de la manière suivante:

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

(Référence)

    
réponse donnée jokerdino 20.06.2012 - 09:18
la source
7

La raison en est que la chaîne

grep firefox

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

grep [f]irefox

ne correspond pas au modèle [f]irefox (ce qui équivaut au modèle firefox ).

C'est pourquoi le premier grep correspond à sa propre ligne de commande de processus, tandis que le second ne le fait pas.

    
réponse donnée Daniel Hershcovich 25.06.2012 - 20:06
la source

Lire d'autres questions sur les étiquettes