Daha zarif “ps aux | grep -v grep ”


177

İşlemler listesini kontrol ettiğimde ve benim için ilginç olanları 'grep' ettiğimde, grepkendisi de sonuçlara dahil edilir. Örneğin, terminalleri listelemek için:

$ 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

Normalde ps aux | grep something | grep -v grepson girişten kurtulmak için kullanıyorum ... ama zarif değil :)

Bu sorunu çözmek için daha zarif bir kesmek var mı (tüm komutu ayrı bir komut dosyasına sarmak dışında, aynı zamanda kötü değil)


4
Değeri için, bu eski bir SSS. Öğeyi 3.10 Bkz faqs.org/faqs/unix-faq/faq/part3
tripleee

1
Referans için teşekkürler. Bu onların bir yöntem vardır:ps ux | awk '/name/ && !/awk/ {print $2}'
Jakub M.

grep -v grepParça ne yapıyor?
Jwan622

2
@ Jwan622 , grep sonuçlarını grep -v grepiçermez grep. Grep, ps ile birlikte kullanılırsa, sonuçlarınızı karmaşıklaştıracak şekilde grep işlemi de (grep argümanlarıyla birlikte) gösterilir. grep -v grep bunu önlemek için yaygın bir yoldur
Eugene Platonov

Yanıtlar:


282

Her zamanki teknik şudur:

ps aux | egrep '[t]erminal'

Bu içeren satırları maç olacak terminal, hangi egrep '[t]erminal'değil! Ayrıca Unix'in birçok lezzeti üzerinde de çalışır .


1
Bu benim için rasgele bir dize için çalışıyor, ancak bir kullanıcı adı için değil, örneğin ps aux | grep '[r]oot'. Nedenini bilen var mı?
kxsong

2
@kxsong: | grep '[t]erminal''terminal' kelimesini içeren herhangi bir satırı işlem listesine 'terminal' kelimesini koymadan seçer. Ne elde etmeye çalışıyorsunuz | grep '[r]oot've nasıl çalışmıyor? Daha iyi bir çözüm olması muhtemeldir.
Johnsyweb

3
Eğer yanılıyorsam beni düzeltin, ama bu aynı zamanda açılmış karakterin herhangi bir pozisyonu üzerinde çalışması gerekir: ps aux | grep "te [r] minal"
meso_2600 23:16

2
parlak kesmek (Sanırım bunu söylemeliyim, çünkü aux / grep yazarları muhtemelen bu senaryoyu düşünmediler.)
Michael Trouw

2
@JamieJag: Şey ... yazımda söylediğim gibi, grep '[t]erminal'içeren satırlarla eşleşecek terminal. Kaynağının çıktısı (köşeli parantez ile), dizeyi içermeyen (aynı olmadan ) ps auxbir çizgiye sahip olacaktır . grep '[t]erminal'terminal
Johnsyweb

57

Pgrep kullanın . Daha güvenilir.


pgrepBen örneğin bakarsanız alışkanlık işps aux | grep 'ssh options'
Jakub M.

12
Jakub M .: Ne olmuş pgrep -f?
hillu

4
@ jakub-m Varsayılan pgrepolarak deseni yalnızca işlem adıyla eşleştirir. Komutun tamamıyla eşleştirmek için -fbayrağı kullanın .
bluecollarcoder

3
pgrepyalnızca işlem kimliklerini döndürür.
Melab

1
eski sürümler aldı pgrep -fl(ancak cmdline ile eşleşmeden tam cmdline'ı göremedik -f, ayrıntılar: serverfault.com/a/619788/44183 ). Ama evet pid, cmdline dışında başka bir bilgiye ihtiyacınız varsa, ihtiyacınız var ps. Onları birleştirebilir:ps -p $(pgrep -f foo)
Beni Cherniavsky-Paskin

29

Bu cevap önceki bir pgrep cevaba dayanmaktadır . Ayrıca , kullanımı ile birleştiren başka bir cevap üzerine kuruludur . İşte bazı ilgili eğitim örnekleri:pspgrep

$ 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]

Yukarıdakiler bir fonksiyon olarak kullanılabilir :

$ 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

Kullanılarak karşılaştırın psile grep. Yararlı başlık satırı yazdırılmaz:

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


@blueyed, cevabı bash fonksiyon tanımıyla güncelledim.
Acumenus

-dBir ayırıcı belirtme seçeneğine de dikkat edin ; ör.ps -fp$(pgrep -d , getty)
Toby Speight

1
Bunu kullanın: Son parametre olması gerektiğini ps uxp `pgrep <process>` unutmayın p(yani, puxişe yaramaz)
KFL

9

Ps komutunda filtreleyebilirsiniz, ör.

ps u -C gnome-terminal

(veya find / with proc ile arama yapın vb.)


1
Bunun GNU'nun ps (Linux) ile çalıştığını, ancak BSD ps ile çalışmadığını unutmayın.
Josh

Bu GNU ps ile bile yanlıştır. ps -C <command>tam komutla eşleşecektir. Birlikte kullanıldığında aveya xseçenekler yüzünden, tüm işlemleri bildirir ave xliste süreçlerini ek olarak başka yollarla eşleşti süreçlerin kümesine.
Animizm

@Animizm Doğru. Teşekkürler, düzelttim.
Andreas Frische

Bu yalnızca işlem adı tam olarak belirtilmişse çalışır. Bu, kısmi maç için örneğin çalışmıyor logindiçin systemd-logindveya argümanlar eşleşecek.
Acumenus

4

Bir alternatif daha :

ps -fC terminal

İşte seçenekler:

 -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
Küçük bir dezavantaj ve OP'nin sorusuyla gerçekten ilgili olmayan bir şey, bunun Tomcat gibi, aslında bir tartışma listesi içeren java olarak çalıştırılan şeyleri göstermeyeceği.
Charles Wood

-C@Andreas Frishe'nin cevabı bir buçuk yıl önce gönderilmiş olan seçeneklerde zaten önerildi…
Piotr Dobrogost

3

Arama deseninde bir karakteri çevrelemek için köşeli ayraç kullanmak grep, eşleşen normal ifadeyi içermediğinden işlemi hariç tutar .

$ 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

Feragatname: Bu aracın yazarıyım ama ...

Px kullanırdım :

~ $ 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

Makul bir komut satırı arabirimine sahip süreçleri bulmak dışında, birçok başka yararlı şey, proje sayfasında daha fazla ayrıntı yapar .

Kolayca kurulabilen Linux ve OS X üzerinde çalışır:

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

0

Nihai kullanım durumuna bağlı olarak, genellikle Awk'ı tercih etmek istersiniz.

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

Bu, özellikle,

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

Açıkçası normal ifade Awk betiğine önemsiz bir şekilde çarpanlarına ayrılabilir:

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

Ama gerçekten, bunu kendiniz yeniden yaratmayın. pgrepve arkadaşlar uzun süredir etrafta ve bu sorun alanının çoğunu geçici yeniden uygulamalardan çok daha iyi idare ediyorlar.


-2

Başka bir seçenek .bash_profilede sonuçlarınızı 'grep' olarak gösteren bir işlev oluşturmak için (veya bash diğer adlarını sakladığınız başka bir dosyayı) düzenlemektir .

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

alias grep='mygrep'

grep -v grepİlk aksi olmak zorunda senin--color=auto herhangi bir nedenle çalışmayacak.

Eğer bash kullanıyorsanız bu işe yarar; Farklı bir kabuk YMMV kullanıyorsanız.


1
Diğer ad ve işlev nedir? Sadece yapın function grep { command grep -v grep | command grep --color=auto "$@"; }(ayrıca argümanın ve alıntılamanın düzeltilmesine de dikkat edin). Bununla birlikte, bu durumun psçağrılmaması grepartık işe yaramayacak (argümanlar yanlış iletilmiş). Her neyse, çok daha kullanışlı bir işlev grep, grepsonuçlardan ayrı olarak filtrelemek yerine regex'i kendisiyle eşleşmeyecek şekilde değiştiren bir işlev olacaktır . Ve elbette, on yıllar önce yeterince çözülmüş bir soruna yeni çözümler icat etmek çok verimli değil.
Üçlü
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.