Quelle est la signification du symbole «|» dans la coquille?

16

Que signifie le |symbole dans la sudo ps -ef | grep processnamecommande?

Quelqu'un peut-il également expliquer cette commande? J'ai utilisé cette commande uniquement pour obtenir le PID et tuer ce processus, mais j'ai également vu sudo ps -ef | grep processname | grep -v grepet j'ai l'impression que -v grepc'est comme tuer le PID généré précédemment pour grep. Si c'est le cas, comment ça marche?

Aamir
la source
4
Vous n'avez pas besoin sudode courir ps -ef. Une astuce courante pour éviter la troisième commande consiste à placer un caractère du nom du processus entre crochets:ps -ef | grep [p]rocessname
kos
1
@kos Cette commande a besoin de guillemets pour fonctionner de manière fiable:ps -ef | grep '[p]rocessname'
kasperd
2
@kos Si vous écrivez grep [p]rocessname, vous dites au shell de rechercher un fichier dans le répertoire courant avec le nom processnameet de remplacer le modèle par le nom de ce fichier. Si aucun fichier nommé processnamen'existe, le shell peut passer le modèle littéralement à grep. Mais cela dépend de vos paramètres. Donc , votre version cassera si un fichier nommé processnameexiste ou si l' une des options suivantes shell a été activé failglob, nullglob, nocaseglob.
kasperd
1
@kasperd J'ai mal lu votre dernier commentaire, oui, vous avez raison sur tout. Je n'y ai pas pensé.
kos
1
Je ne peux pas croire que ce ne soit pas un doublon.
Mast

Réponses:

13
ps -ef | grep processname

Il s'exécute d'abord sudo ps -efet transmet la sortie à la deuxième commande.

La deuxième commande filtre toutes les lignes qui contiennent le mot "processname".

ps -ef | grep processname | grep -v grepliste toutes les lignes contenant processnameet ne contenant pas grep.

Selon man grep

-v, --invert-match
              Invert the sense of matching, to select non-matching lines.  (-v
              is specified by POSIX.)

Selon man ps

ps displays information about a selection of the active processes.

-e     Select all processes.  Identical to -A.

-f     Do full-format listing. This option can be combined with many
          other UNIX-style options to add additional columns.  It also
          causes the command arguments to be printed.  When used with -L,
          the NLWP (number of threads) and LWP (thread ID) columns will be
          added.  See the c option, the format keyword args, and the
          format keyword comm.

Vous pouvez combiner les paramètres -efsignifie la même chose que -e -f.

En fait, ps -ef | grep processnamerépertoriez toutes les occurrences du processus appelé processname.

Pilot6
la source
merci pour l'explication, qu'est-ce que ps -effait exactement ??
Aamir
je pense que lorsque nous exécutons | grep processNamedans le terminal, nous obtenons également la sortie de grep qui est lui-même un processus, donc -v tue cette sortie
Aamir
Vous avez raison.
Pilot6
35

Ça s'appelle pipe. Il donne la sortie de la première commande comme entrée à la deuxième commande.

Dans votre cas, cela signifie:
Le résultat de sudo ps -efest alimenté en entrée degrep processname

sudo ps -ef:
Liste tous les processus en cours d'exécution. Tapez man psle terminal pour en savoir plus.

grep processname
Ainsi, cette liste de processus est introduite dans grep qui recherche simplement le programme défini par programname.

Exemple

Taper sudo ps -ef | grep firefoxmon terminal renvoie:

parto     6501  3081 30 09:12 ?        01:52:11 /usr/lib/firefox/firefox
parto     8295  3081  4 15:14 ?        00:00:00 /usr/bin/python3 /usr/share/unity-scopes/scope-runner-dbus.py -s web/firefoxbookmarks.scope
parto     8360  8139  0 15:14 pts/24   00:00:00 grep --color=auto firefox
Parto
la source
ok, ce que -v grep, que fait-il.
Aamir
bonne explication mais j'ai besoin d'aide sur le -v grep fonctionnement ..
Aamir
Oh, je vois pourquoi grep -vest utilisé. Pour filtrer la dernière ligne.
Pilot6
@Aamir Voir ma réponse. grep -vfiltre les lignes OUT contenant le motif.
Pilot6
1
Vous pouvez également ajouter que vous pouvez utiliser plusieurs tuyaux. Ex: écho "foobar" | grep foo | grep bar
Michael
7

Je vais essayer de répondre à cette question avec une réponse pratique directe:

La pipe |vous permet de faire des trucs géniaux dans la coque! C'est le seul opérateur que je considère comme le plus utile et le plus puissant.

que diriez-vous de compter les fichiers dans un répertoire? Facile:

ls | wc -l..redirige la sortie de lsto wcwit -lpour les lignes

ou comptage de lignes dans un fichier?

cat someFile | wc -l

et si je veux chercher quelque chose? 'grep' peut rechercher des occurrences de chaînes:

cat someFile | grep aRandomStringYouWantToSearchFor

vous redirigez simplement la sortie de la commande à gauche du tuyau vers la commande à droite du tuyau.

un niveau de plus: à quelle fréquence quelque chose se produit-il dans un fichier?

cat someFile | grep aRandomStringYouWantToSearchFor | wc -l

vous pouvez utiliser le | pour presque tout :)

fortune | cowsay

entrez la description de l'image ici

Gewure
la source
2
Oui, les pipes sont amusantes, +1, mais veuillez changer les exemples: UUOC .
kos
Comme: grep -c "aRandomStringYouWantToSearchFor" "someFile";-)
Sadi
ofc. mais dans un but de simplicité ... le
propriétaire de
1
Franchement, beaucoup de vos exemples n'ont pas besoin de tuyaux. Avez-vous entendu parler de démoggification? Vous utilisez cat et pipe alors que de nombreuses commandes prendront directement les fichiers comme paramètres: par exemple cat someFile | grep aRandomStringYouWantToSearchFor devrait être grep aRandomStringYouWantToSearchFor someFile
Captain Lepton
les gars .. je sais. si vous aviez lu les commentaires, capitaine, vous auriez lu ma réponse. Le gars qui a posé les questions ne comprendra pas les VRAIES applications du tuyau - il ne sait même pas ce qu'est le grep. alors dois-je lui donner cet exemple? kill $(ps aux | awk '/someString/ { print $2}' | sed -n '1p') non, car cela ne servirait pas du tout le but.
Gewure
4

J'ai utilisé cette commande uniquement pour obtenir le PID et tuer ce processus

D'autres réponses ont déjà répondu à votre question principale, mais j'aimerais également y répondre;

En général, tuer un processus est souvent exagéré et laisse les ressources allouées par un processus dans un état désordonné, vous pouvez souvent y mettre fin ;

À côté de cela, utilisez simplement pkillpour tuer / terminer un processus. pkillprend en charge la spécification d'un nom de processus exact ou d'une expression régulière:

pkill -x foo # Terminates process foo
pkill ^foo$ # Terminates process foo
pkill -9 -x foo # Kills process foo
pkill -9 ^foo$ # Kills process foo
kos
la source
1
N'employez pas à kill -9moins que vous sachiez spécifiquement qu'aucun autre signal ne fonctionnera. Voir aussi iki.fi/era/unix/award.html#kill
tripleee
@tripleee OP a cependant déclaré vouloir tuer le processus.
kos
Voilà ce qui killfait. La spécification -9est une option supplémentaire supplémentaire et le plus souvent désastreuse.
tripleee
@tripleee Je pense que la confusion vient de la terminologie; pour moi tuer = SIGKILL, pas SIGTERM.
kos
Pour la plupart des gens, je m'attendrais à ce que "tuer" signifie kill, clair et simple. Indépendamment de la terminologie, votre réponse ne devrait pas conseiller aux gens d'utiliser l' -9option, sauf si vous mettez une mise en garde charnue.
tripleee