web-dev-qa-db-fra.com

commande grep et []

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.

10
linofex

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
14
terdon

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.

6
Robert Longson

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 greping 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.

3
heemayl

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.

1
Bidyut