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

16

Che cosa significa il simbolo | nel comando sudo ps -ef | grep processname ?

Qualcuno può, per favore, 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 grep e ho l'impressione che -v grep sia come uccidere il PID generato precedente per grep . Se è così, come funziona?

    
posta Aamir 01.12.2015 - 13:11

4 risposte

13
ps -ef | grep processname

Esegue prima sudo ps -ef e passa l'output al secondo comando.

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

ps -ef | grep processname | grep -v grep elenca tutte le righe contenenti processname e non contenenti 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.

Puoi combinare i parametri -ef significa come -e -f .

In realtà ps -ef | grep processname elenca tutte le occorrenze del processo chiamate processname .

    
risposta data Pilot6 01.12.2015 - 13:17
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 di grep processname

sudo ps -ef :
Questo elenca tutti i processi in esecuzione. Digita man ps nel termial 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 firefox nel mio terminale 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
    
risposta data Parto 01.12.2015 - 13:14
7

Cercherò di rispondere a questa domanda con una risposta pratica semplice:

Il pipe | ti permette 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 ls a wc con parametro -l per le linee

o il conteggio delle linee in un file?

cat someFile | wc -l

e se volessi cercare qualcosa? 'grep' può cercare le occorrenze di stringhe:

cat someFile | grep aRandomStringYouWantToSearchFor

devi semplicemente reindirizzare l'output del comando a sinistra di Pipe al comando a destra della pipe.

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

cat someFile | grep aRandomStringYouWantToSearchFor | wc -l

puoi usare il | per quasi tutto:)

fortune | cowsay

    
risposta data Gewure 01.12.2015 - 16:57
4
  

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

Altre risposte hanno già risposto alla tua domanda principale, ma mi piacerebbe affrontare anche questo;

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

Accanto a questo, basta usare pkill per uccidere / terminare un processo. pkill supporta la specifica di un nome di processo esatto 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
    
risposta data kos 01.12.2015 - 13:40

Leggi altre domande sui tag