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.
command-line
bash
grep
Thorsen
la source
la source
Réponses:
L'expression entre crochets fait partie du
shell bash (et d'autres shells également)du modèle de correspondance de classe de caractères de grep.Le
grep
programme comprend par défaut les expressions régulières de base POSIX. Avec cela, vous pouvez définir des classes de caractères. Par exempleps -ef | grep [ab9]irefox
, trouverait " un irefox", " b irefox", " 9 irefox" si ceux-ci existaient, mais pas " 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".Alors
ps -ef | grep firefox
cherche des lignes avecfirefox
dedans. Puisque le processus grep lui-même contient "firefox", grep le trouve également. En ajoutant a[]
, 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 maintenant 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 deuxième 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:
(Référence)
la source
[f]
s’agit du crochet d’expression régulière utilisé pour les classes de caractères. Comme dans "[a-z0-9] irefox", grep correspondrait également "airefox" et "0irefox". Vous pouvez facilement voir que ce n'est pas une bash intégrée, car elleecho $([f])
renvoie une erreur.[f]irefox
fonctionne à cette fin est qu’elle n’est pas développée par le shell. Lorsque le shell se développe[f]irefox
enfirefox
, cela entraîne lagrep
visualisationfirefox
, et fait ensuitefirefox
partie degrep
la chaîne de commande de, exactement comme si ellesgrep firefox
étaient exécutées. Mais il est bon de garder pattern matching coquille à l' esprit , en particulier lorsque les scripts, parce que s'il y a un fichier appeléfirefox
dans le répertoire courant , le shell n'étendre à[f]irefox
firefox
et cette méthode échoue, par exemple, lagrep
ligne deps
est affiché.La raison est que la chaîne
correspond au motif
firefox
, mais la chaînene correspond pas au motif
[f]irefox
(ce qui est équivalent au motiffirefox
).C'est pourquoi le premier grep correspond à sa propre ligne de commande de processus, alors que le second ne le fait pas.
la source