Qual è il significato del simbolo `|` nella shell?


16

Cosa significa il |simbolo in sudo ps -ef | grep processnamecomando?

Qualcuno può anche spiegare questo comando? Ho usato questo comando solo per ottenere il PID e uccidere quel processo, ma ho anche visto sudo ps -ef | grep processname | grep -v grepe ho l'impressione che -v grepsia come uccidere il precedente PID generato per grep. Se è così, come funziona?


4
Non devi sudocorrere ps -ef. Un altro trucco comune per evitare il terzo comando è racchiudere un carattere del nome del processo tra parentesi quadre:ps -ef | grep [p]rocessname
kos

1
@kos Quel comando necessita di virgolette per funzionare in modo affidabile:ps -ef | grep '[p]rocessname'
kasperd,

2
@kos Se scrivi grep [p]rocessname, stai dicendo alla shell di cercare un file nella directory corrente con il nome processnamee di sostituire il modello con il nome di quel file. Se non processnameesiste alcun file denominato , la shell può passare letteralmente il modello a grep. Ma questo dipende dalle tue impostazioni. Così la versione si romperà se un file di nome processnameesiste o se una delle seguenti opzioni di shell è stato attivato failglob, nullglob, nocaseglob.
Kasperd,

1
@kasperd Ho letto male il tuo ultimo commento, sì, hai ragione su tutto. Non l'ho considerato.
kos,

1
Non posso credere che questo non sia un duplicato.
Albero

Risposte:


13
ps -ef | grep processname

Viene prima eseguito sudo ps -efe passa l'output al secondo comando.

Il secondo comando filtra tutte le righe che contengono la parola "nome processo".

ps -ef | grep processname | grep -v grepelenca tutte le righe che contengono processnamee non contengono grep.

Secondo man grep

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

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

È possibile combinare i parametri -efsignifica lo stesso di -e -f.

ps -ef | grep processnameElenca effettivamente tutte le occorrenze del processo chiamato processname.


grazie per la spiegazione, cosa ps -effa esattamente ??
Aamir,

penso che quando corriamo | grep processNamenel terminale otteniamo anche l'output di grep che a sua volta è un processo quindi -v uccide questo output
Aamir

Hai ragione.
Pilota 6

35

Si chiama pipe. Fornisce l'output del primo comando come input per il secondo comando.

Nel tuo caso significa:
Il risultato di sudo ps -efè alimentato come input digrep processname

sudo ps -ef:
Elenca tutti i processi in esecuzione. Digita man psil termine per ulteriori informazioni.

grep processname
Quindi, questo elenco di processi viene inserito in grep che cerca solo il programma definito da programname.

Esempio

Digitando sudo ps -ef | grep firefoxnel mio terminale si ritorna:

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

ok, cosa -v grep, cosa fa.
Aamir,

buona spiegazione ma ho bisogno di aiuto su come -v grep funziona ..
Aamir,

Oh, capisco perché grep -vviene usato. Per filtrare l'ultima riga.
Pilota 6

@Aamir Vedi la mia risposta. grep -vfiltra le linee OUT che contengono pattern.
Pilota 6

1
È inoltre possibile aggiungere che è possibile utilizzare più pipe. Ad esempio echo "foobar" | grep foo | grep bar
Michael

7

Proverò a rispondere a questa domanda con una risposta pratica diretta:

La pipa |ti consente di fare cose fantastiche nella shell! È l'unico operatore che considero il più utile e potente.

che ne dici di contare i file in una directory? semplice:

ls | wc -l.. reindirizza l'output di lsto wcwit parametro -lper le righe

o il conteggio delle righe in un file?

cat someFile | wc -l

cosa succede se voglio cercare qualcosa? 'grep' può cercare occorrenze di stringhe:

cat someFile | grep aRandomStringYouWantToSearchFor

basta reindirizzare l'output del comando a sinistra della pipe al comando a destra della pipe.

un altro livello: quanto spesso succede qualcosa in un file?

cat someFile | grep aRandomStringYouWantToSearchFor | wc -l

puoi usare il | per quasi tutto :)

fortune | cowsay

inserisci qui la descrizione dell'immagine


2
Sì, le pipe sono divertenti, +1, ma per favore cambia gli esempi: UUOC .
kos,

Mi piace: grep -c "aRandomStringYouWantToSearchFor" "someFile";-)
Sadi,

ofc. ma ai fini della semplicità ... il richiedente non sembra essere più profondo in grep, ad esempio :)
Gewure,

1
Francamente molti dei tuoi esempi non hanno bisogno di pipe. Hai sentito della demoggificazione? Stai usando cat and pipe quando molti dei comandi prenderanno direttamente i file come parametri: es. Cat someFile | grep aRandomStringYouWantToSearchFor dovrebbe essere grep aRandomStringYouWantToSearchFor someFile
Captain Lepton

ragazzi .. lo so. se leggessi i commenti, Capitano, avresti letto la mia risposta. Il ragazzo che ha posto le domande non capirà le REAL REALIZZAZIONI della pipe - non sa nemmeno che cos'è grep. quindi dovrei dargli questo esempio? kill $(ps aux | awk '/someString/ { print $2}' | sed -n '1p') no, perché non servirebbe affatto allo scopo.
Gewure,

4

Ho usato questo comando solo per ottenere il PID e uccidere quel processo

Altre risposte hanno già risposto alla tua domanda principale, ma vorrei rispondere anche a questo;

In generale, uccidere un processo è spesso eccessivo e lascia risorse allocate da un processo in uno stato disordinato, spesso è possibile semplicemente terminarlo ;

Inoltre, basta usare pkillper terminare / terminare un processo. pkillsupporta la specifica di un nome esatto di processo o di un'espressione regolare:

pkill -x foo # Terminates process foo
pkill ^foo$ # Terminates process foo
pkill -9 -x foo # Kills process foo
pkill -9 ^foo$ # Kills process foo

1
Non utilizzare a kill -9meno che non si sappia specificamente che nessun altro segnale funzionerà. Vedi anche iki.fi/era/unix/award.html#kill
tripleee

@tripleee OP ha dichiarato di voler uccidere il processo però.
kos,

Questo è quello che killfa. La specifica -9è un'opzione aggiuntiva aggiuntiva e spesso disastrosa.
Tripleee

@tripleee Credo che la confusione stia sorgendo a causa della terminologia; per me uccidere = SIGKILL, non SIGTERM.
kos,

Per la maggior parte delle persone, mi aspetto che "uccidere" significhi kill, chiaro e semplice. A parte la terminologia, la tua risposta non dovrebbe consigliare alle persone di usare l' -9opzione a meno che tu non abbia messo un avvertimento carnoso.
Tripleee
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.