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.
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
La raison est que la chaîne
grep firefox
correspond au modèle firefox
name__, mais la chaîne
grep [f]irefox
ne correspond pas au modèle [f]irefox
(qui correspond au modèle firefox
name__).
C'est pourquoi le premier grep correspond à sa propre ligne de commande de processus, contrairement au second.