J'apprends le code bash et aujourd'hui j'étudie la commande grep
.
si je cours
$ ps -fU user | grep Thunderbird
spectacles terminaux:
user 17410 1 0 10:09 ? 00:00:20 /usr/lib/Thunderbird/thunderbird
user 18990 15896 0 12:25 pts/1 00:00:00 grep --color=auto Thunderbird
Mais si je cours:
$ ps -fU user | grep [t]hunderbird
spectacles terminaux:
user 17410 1 0 10:09 ? 00:00:20 /usr/lib/Thunderbird/thunderbird
pourquoi? J'ai lu le guide mais je ne comprends pas.
Il y a deux problèmes ici. Tout d'abord, lorsque vous exécutez ps | grep ...
, le processus grep
apparaît également dans le résultat de ps
. La sortie ps
par défaut inclut les arguments avec lesquels un processus a été lancé, pas seulement le nom du processus. Cela signifie que si vous exécutez grep foo
et qu'un processus appelé foo
est en cours d'exécution, il y aura deux résultats ps
correspondant à foo
: le processus foo
et le grep
lui-même puisqu'il recherche foo
. C'est pourquoi vous obtenez deux lignes lorsque vous exécutez ps -f | grep Thunderbird
.
Maintenant, le [ ]
est une construction d'expression régulière qui définit une liste de caractères, une classe de caractères. Par exemple, [abc]
correspondra à a
ou b
ou c
. Lorsque vous exécutez ps -f | grep [t]hunderbird
, cette classe ne contient qu'un seul caractère et est donc équivalente à Thunderbird
sans les crochets. Cependant, le processus grep
a été lancé avec [t]hunderbird
comme argument cette fois et non pas Thunderbird
. Par conséquent, sa ligne dans la sortie de ps
contiendra [t]hunderbird
. Il ressemblera à ceci:
terdon 23101 10991 0 16:53 pts/3 00:00:00 grep --color [t]hunderbird
Cela signifie qu'il ne correspond pas lorsque vous exécutez ps -f | grep Thunderbird
car il contient [t]hunderbird
et non Thunderbird
.
C'est une astuce courante pour éviter de faire correspondre le processus grep
lors de l'exécution de ps | grep
. Une autre alternative consiste à exécuter ps -f | grep foo | grep -v grep
pour exclure la grep
. La meilleure approche consiste toutefois à utiliser un programme spécialement conçu à cet effet, pgrep
:
$ pgrep -l Thunderbird
11330 Thunderbird
Dans le premier cas, vous recherchez un processus contenant Word Thunderbird. Il existe deux commandes Thunderbird et la commande grep elle-même.
Dans le second cas, vous recherchez également le caractère t
suivi de hunderbird
, car le [t] signifie que tous les caractères répertoriés dans le crochet dont il n’ya que la lettre t, mais chronométrez vos deux processus
user 17410 1 0 10:09 ? 00:00:20 /usr/lib/Thunderbird/thunderbird
user 18990 15896 0 12:25 pts/1 00:00:00 grep --color=auto [t]hunderbird
Le second processus ne correspond pas car rexep [t] hunderbird ne correspond pas à chaîne littérale[t]hunderbird
car le] empêche la correspondance.
Tout d’abord, si grep --color=auto Thunderbird
apparaîtra sur la table de processus et donc sur la sortie de ps
dépend du temps, c’est-à-dire combien de temps votre système est occupé et combien de temps il faut à ps
pour afficher quelque chose sur sa sortie (en analysant le processus table) qui a démarré simultanément, grep
dans ce cas. Bien que ce soit un cas hautement improbable et que nous pouvons supposer que grep
apparaîtra sur la sortie de ps
.
Maintenant, []
est une syntaxe de grep qui signifie (si elle n'est pas suivie par d'autres jetons) correspond à l'un des caractères à l'intérieur de []
. Ainsi, lorsque vous utilisez grep '[t]hunderbird'
, grep
traite le [t]
pour qu’il ne corresponde qu’à t
. En conséquence, il n’apparaît pas dans la sortie.
Lors de l'utilisation de grep Thunderbird
, si cela se présente dans la table des processus, nous trouverons le processus grep
dans la sortie car nous sommes grep
ing pour la même chose, à savoir grep Thunderbird
.
Notez également que grep
est un alias de grep --color=auto
, ce qui l’a également fait apparaître dans la sortie.
Le [] dans grep
est utilisé pour la correspondance des caractères. Si nous prenons grep [tb]all my_file.txt
C'est équivalent à
grep tall my_file.txt
grep ball my_file.txt
Il exécutera grep
en prenant t + tout, puis il exécutera grep
en prenant b + tout.
Par exemple: Si nous voulons rechercher un mot ABC ou BBC dans un fichier, nous pouvons utiliser la commande grep suivante:
grep [AB]BC file_name
Ici, le [] fera grep
développer le mot en prenant A, puis il développera le mot en utilisant B, créant ainsi ABC et BBC.