“Ps aux |. Più elegante grep -v grep "


177

Quando controllo l'elenco dei processi e 'deseleziono' quelli che sono interessanti per me, lo grepstesso viene incluso nei risultati. Ad esempio, per elencare i terminali:

$ ps aux  | grep terminal
user  2064  0.0  0.6 181452 26460 ?        Sl   Feb13   5:41 gnome-terminal --working-directory=..
user  2979  0.0  0.0   4192   796 pts/3    S+   11:07   0:00 grep --color=auto terminal

Normalmente uso ps aux | grep something | grep -v grepper liberarmi dell'ultima voce ... ma non è elegante :)

Hai un trucco più elegante per risolvere questo problema (a parte avvolgere tutti i comandi in uno script separato, che non è male)


4
Per quello che vale, questa è un'antica FAQ. Vedi il punto 3.10 su faqs.org/faqs/unix-faq/faq/part3
tripleee,

1
Grazie per riferimento. Questo è il loro metodo:ps ux | awk '/name/ && !/awk/ {print $2}'
Jakub M.

Cosa sta grep -v grepfacendo la parte?
Jwan622,

2
@ Jwan622 grep -v grepesclude grepdai risultati grep. Se grep viene usato in combinazione con ps, verrà mostrato anche il processo grep (con argomenti grep), ingombrando i risultati. grep -v grep è un modo comune per evitarlo
Eugene Platonov,

Risposte:


282

La solita tecnica è questa:

ps aux | egrep '[t]erminal'

Questo corrisponderà alle righe che contengono terminal, il che egrep '[t]erminal'no! Funziona anche su molti gusti di Unix.


1
Questo funziona per me per una stringa arbitraria, ma non per un nome utente, ad es ps aux | grep '[r]oot'. Qualcuno sa perché?
kxsong,

2
@kxsong: | grep '[t]erminal'seleziona qualsiasi riga contenente la parola "terminale" senza inserire la parola "terminale" nell'elenco dei processi. Cosa stai cercando di ottenere | grep '[r]oot'e come non funziona? È probabile che ci sia una soluzione migliore.
Johnsyweb,

3
Correggimi se sbaglio, ma anche questo dovrebbe funzionare su qualsiasi posizione del personaggio grepped: ps aux | grep "te [r]
minal

2
geniale hack (penso che dovrei chiamarlo così, dal momento che gli autori aux / grep probabilmente non hanno pensato a questo scenario.)
Michael Trouw,

2
@JamieJag: Beh ... come ho detto nel mio post, grep '[t]erminal'corrisponderà alle righe che contengono terminal. L'output da ps auxavrà una linea con grep '[t]erminal'(con le parentesi quadre), che non contiene la stringa terminal(senza la stessa).
Johnsyweb,

57

Usa pgrep . È più affidabile.


pgrepnon funzionerò se cerco ad esempiops aux | grep 'ssh options'
Jakub M.

12
Jakub M .: Che dire pgrep -f?
Hillu,

4
@ jakub-m Per impostazione predefinita, pgrepcorrisponde solo al modello rispetto al nome del processo. Per abbinare l'intero comando, usa la -fbandiera.
bluecollarcoder,

3
pgreprestituisce solo ID di processo.
Melab,

1
sono state eseguite versioni precedenti pgrep -fl(ma non è stato possibile visualizzare la cmdline completa senza -fcorrispondere alla cmdline completa, dettagli: serverfault.com/a/619788/44183 ). Ma sì, se hai bisogno di altre informazioni oltre a pid, cmdline, hai bisogno ps. Possono combinarli:ps -p $(pgrep -f foo)
Beni Cherniavsky-Paskin,

29

Questa risposta si basa su una pgrep risposta precedente . Si basa anche su un'altra risposta che combina l'uso di pscon pgrep. Ecco alcuni esempi di formazione pertinenti:

$ pgrep -lf sshd
1902 sshd

$ pgrep -f sshd
1902

$ ps up $(pgrep -f sshd)
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root      1902  0.0  0.1  82560  3580 ?        Ss   Oct20   0:00 /usr/sbin/sshd -D

$ ps up $(pgrep -f sshddd)
error: list of process IDs must follow p
[stderr output truncated]

$ ps up $(pgrep -f sshddd) 2>&-
[no output]

Quanto sopra può essere utilizzato come funzione :

$ psgrep() { ps up $(pgrep -f $@) 2>&-; }

$ psgrep sshd
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root      1902  0.0  0.1  82560  3580 ?        Ss   Oct20   0:00 /usr/sbin/sshd -D

Confronta con l'utilizzo pscon grep. La riga dell'intestazione utile non viene stampata:

$  ps aux | grep [s]shd
root      1902  0.0  0.1  82560  3580 ?        Ss   Oct20   0:00 /usr/sbin/sshd -D

Vedi github.com/blueyed/oh-my-zsh/blob/… (ma è specifico di Zsh).
blu del

@blueyed, ho aggiornato la risposta con la definizione della funzione bash.
Acumenus,

Nota anche l' -dopzione per specificare un separatore; ad es.ps -fp$(pgrep -d , getty)
Toby Speight,

1
Uso questo: ps uxp `pgrep <process>` nota che pdeve essere l'ultimo parametro (ovvero, puxnon funzionerà)
KFL

9

Puoi filtrare nel comando ps, ad es

ps u -C gnome-terminal

(o cerca in / proc con find ecc.)


1
Nota che funziona con ps (Linux) di GNU, ma non con ps di BSD.
Josh,

Questo non è corretto anche con GNU ps. ps -C <command>corrisponderà al comando esatto. Quando viene utilizzato con le ao xopzioni che riporterà tutti i processi, in quanto ae xlista dei processi in aggiunta alla serie di processi corrispondenti con altri mezzi.
Animismo,

@Animism True. Grazie, l'ho risolto.
Andreas Frische,

Funziona solo se il nome del processo è specificato esattamente. Non funziona per una corrispondenza parziale, ad esempio logindper systemd-logindo per la corrispondenza di argomenti.
Acumenus,

4

Un'altra alternativa :

ps -fC terminal

Ecco le opzioni:

 -f        does 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.

 -C cmdlist     Select by command name.
                This selects the processes whose executable name is
                given in cmdlist.

6
Un piccolo svantaggio, e che non è realmente correlato alla domanda di OP, è che questo non ti mostrerà cose come Tomcat, che in realtà viene eseguito come java con una lista di argomenti.
Charles Wood,

-Copzione era già stata suggerita nella risposta di @Andreas Frishe pubblicata oltre un anno e mezzo prima ...
Piotr Dobrogost,

3

L'uso delle parentesi per circondare un carattere nel modello di ricerca esclude il grepprocesso poiché non contiene la regex corrispondente.

$ ps ax | grep 'syslogd'
   16   ??  Ss     0:09.43 /usr/sbin/syslogd
18108 s001  S+     0:00.00 grep syslogd

$ ps ax | grep '[s]yslogd'
   16   ??  Ss     0:09.43 /usr/sbin/syslogd

$ ps ax | grep '[s]yslogd|grep'
   16   ??  Ss     0:09.43 /usr/sbin/syslogd
18144 s001  S+     0:00.00 grep [s]yslogd|grep

3

Disclaimer: sono l'autore di questo strumento, ma ...

Vorrei usare px :

~ $ px atom
  PID COMMAND          USERNAME   CPU RAM COMMANDLINE
14321 crashpad_handler walles   0.01s  0% /Users/walles/Downloads/Atom.app/Contents/Frameworks/Electron Framework.framework/Resources/crashpad_handler --database=
16575 crashpad_handler walles   0.01s  0% /Users/walles/Downloads/Atom.app/Contents/Frameworks/Electron Framework.framework/Resources/crashpad_handler --database=
16573 Atom Helper      walles    0.5s  0% /Users/walles/Downloads/Atom.app/Contents/Frameworks/Atom Helper.app/Contents/MacOS/Atom Helper --type=gpu-process --cha
16569 Atom             walles   2.84s  1% /Users/walles/Downloads/Atom.app/Contents/MacOS/Atom --executed-from=/Users/walles/src/goworkspace/src/github.com/github
16591 Atom Helper      walles   7.96s  2% /Users/walles/Downloads/Atom.app/Contents/Frameworks/Atom Helper.app/Contents/MacOS/Atom Helper --type=renderer --no-san

Fatta eccezione per la ricerca di processi con una sensibile interfaccia a riga di comando, fa anche molte altre cose utili, maggiori dettagli sulla pagina del progetto .

Funziona su Linux e OS X, facilmente installabile:

curl -Ls https://github.com/walles/px/raw/python/install.sh | bash

0

A seconda del caso d'uso finale, spesso preferisci invece Awk.

ps aux | awk '/[t]erminal/'

Questo è particolarmente vero quando hai qualcosa del genere

ps aux | grep '[t]erminal' | awk '{print $1}'  # useless use of grep!

dove ovviamente il regex può essere preso in considerazione in modo banale nello script Awk:

ps aux | awk '/[t]erminal/ { print $1 }'

Ma davvero, non reinventarlo da soli. pgrepe gli amici sono in circolazione da molto tempo e gestiscono questo spazio problematico molto meglio della maggior parte delle reimplementazioni ad hoc.


-2

Un'altra opzione è quella di modificare il tuo .bash_profile(o altro file in cui tieni gli alias bash) per creare una funzione che elimini 'grep' dai risultati.

function mygrep {
grep -v grep | grep --color=auto $1
}

alias grep='mygrep'

La grep -v grepdeve essere prima altrimenti la vostra --color=autovolontà non funziona per qualche ragione.

Questo funziona se stai usando bash; se stai usando una shell YMMV diversa.


1
Cos'è l'alias e la funzione? Fai function grep { command grep -v grep | command grep --color=auto "$@"; }(nota anche la correzione dell'argomento e del preventivo). Tuttavia, ciò si interrompe in quanto qualsiasi non psinvocazione di grepnon funzionerà più (gli argomenti vengono passati in modo errato). Comunque, una funzione molto più utile sarebbe quella che modifica la regex in modo che non corrisponda a se stessa, piuttosto che filtrare separatamente grepdai greprisultati. E, naturalmente, inventare nuove soluzioni a un problema che è stato adeguatamente risolto decenni fa non è molto produttivo.
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.