अधिक सुंदर "ps aux | grep -v grep ”


177

जब मैं प्रक्रियाओं की सूची और 'grep' की जाँच करता हूँ जो मेरे लिए दिलचस्प हैं, grepतो परिणाम में यह भी शामिल है। उदाहरण के लिए, टर्मिनलों को सूचीबद्ध करने के लिए:

$ 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

आम तौर पर मैं ps aux | grep something | grep -v grepअंतिम प्रविष्टि से छुटकारा पाने के लिए उपयोग करता हूं ... लेकिन यह सुरुचिपूर्ण नहीं है :)

क्या आपके पास इस समस्या को हल करने के लिए एक अधिक सुंदर हैक है (सभी कमांड को एक अलग स्क्रिप्ट में लपेटने के अलावा, जो खराब भी नहीं है)


4
इसके लायक क्या है, यह एक प्राचीन FAQ है। आइटम 3.10 faqs.org/faqs/unix-faq/faq/part3
ट्रिपलआई

1
संदर्भ के लिए धन्यवाद। यह उनकी विधि है:ps ux | awk '/name/ && !/awk/ {print $2}'
याकूब एम।

क्या है grep -v grepभाग कर?
Jwan622

2
@ Jwan622 को grep परिणामों से grep -v grepबाहर रखा grepगया है। अगर grep का उपयोग ps के साथ संयोजन में किया जाता है, तो grep प्रक्रिया (grep तर्कों के साथ) आपके परिणामों को अव्यवस्थित करते हुए भी दिखाई जाएगी। grep -v grep उससे बचने का एक आम तरीका है
यूजीन प्लैटोनोव

जवाबों:


282

सामान्य तकनीक यह है:

ps aux | egrep '[t]erminal'

यह युक्त रेखाओं से मेल खाएगा terminal, जो egrep '[t]erminal'नहीं करता है! यह यूनिक्स के कई स्वादों पर भी काम करता है ।


1
यह मेरे लिए एक मनमाना स्ट्रिंग के लिए काम करता है, लेकिन उपयोगकर्ता नाम के लिए नहीं, जैसे ps aux | grep '[r]oot'। क्या किसी को पता है क्यों?
kxsong

2
@kxsong: | grep '[t]erminal'किसी भी लाइन को 'टर्मिनल' शब्द से चुनता है, जो 'टर्मिनल' शब्द को प्रोसेस लिस्ट में डाले बिना नहीं है। आप क्या हासिल करना चाह रहे हैं | grep '[r]oot'और यह कैसे काम नहीं कर रहा है? बेहतर समाधान होने की संभावना है।
जॉन्सवेब

3
अगर मैं गलत हूं तो मुझे सुधारें, लेकिन यह भी कि चरित्र के किसी भी स्थान पर काम करना चाहिए: ps aux | grep "te [r]
minal

2
शानदार हैक (मुझे लगता है कि मुझे इसे कॉल करना चाहिए, क्योंकि ऑक्स / grep लेखकों ने शायद इस परिदृश्य के बारे में नहीं सोचा था।)
माइकल परेशानी

2
@ जैमीजाग: ठीक है ... जैसा मैंने अपने पोस्ट में कहा है, इसमें grep '[t]erminal'लाइनों से मेल खाएगा terminal। से आउटपुट में (वर्ग कोष्ठक के साथ) ps auxएक पंक्ति होगी grep '[t]erminal', जिसमें स्ट्रिंग terminal(समान के बिना) शामिल नहीं है।
Johnsyweb

57

Pgrep का उपयोग करें । यह अधिक विश्वसनीय है।


pgrepअभ्यस्त काम अगर मैं उदाहरण के लिए देखोps aux | grep 'ssh options'
याकूब एम।

12
जकूब एम .: किस बारे में pgrep -f?
पहाड़ी

4
@ jakub-m डिफ़ॉल्ट रूप से pgrepकेवल प्रक्रिया नाम के प्रतिमान से मेल खाता है। पूरे कमांड के खिलाफ मिलान करने के लिए, -fध्वज का उपयोग करें ।
bluecollarcoder

3
pgrepकेवल रिटर्न प्रक्रिया आईडी।
मेलाब

1
पुराने संस्करणों को लिया pgrep -fl(लेकिन पूर्ण cmdline के -fमिलान के बिना पूर्ण cmdline नहीं देख सका , विवरण: serverfault.com/a/619788/44183 )। लेकिन हाँ अगर आपको pid, cmdline के पास किसी अन्य जानकारी की आवश्यकता है, तो आपको आवश्यकता है ps। उन्हें मिला सकते हैं:ps -p $(pgrep -f foo)
बेनी चेर्नियाव्स्की-पास्किन

29

यह उत्तर पूर्व के pgrep उत्तर पर बनता है । यह एक अन्य उत्तर के psसाथ उपयोग के संयोजन पर भी बनाता है pgrep। यहाँ कुछ प्रासंगिक प्रशिक्षण उदाहरण हैं:

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

ऊपर एक समारोह के रूप में इस्तेमाल किया जा सकता है :

$ 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

के साथ उपयोग करने के psसाथ तुलना करें grep। उपयोगी हेडर पंक्ति मुद्रित नहीं है:

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

देखें github.com/blueyed/oh-my-zsh/blob/... (लेकिन यह के Zsh के लिए विशिष्ट)।
blueyed

@blueyed, मैंने bash फ़ंक्शन परिभाषा के साथ उत्तर को अपडेट किया है।
एक्यूमेनस

नोट भी -dएक विभाजक निर्दिष्ट करने के लिए विकल्प; जैसेps -fp$(pgrep -d , getty)
स्पाइट

1
मैं इसका उपयोग करता हूं: ps uxp `pgrep <process>` ध्यान दें कि pअंतिम पैरामीटर होना चाहिए (यानी, puxकाम नहीं करेगा)
KFL

9

आप ps कमांड में फ़िल्टर कर सकते हैं, जैसे

ps u -C gnome-terminal

(या माध्यम से खोज / साथ proc पाते हैं आदि)


1
ध्यान दें कि यह जीएनयू के पीएस (लिनक्स) के साथ काम करता है, लेकिन बीएसडी पीएस के साथ नहीं।
जोश

यह GNU ps के साथ भी गलत है। ps -C <command>सटीक कमांड से मेल खाएगा। जब साथ प्रयोग किया aया xविकल्पों यह सभी प्रक्रियाओं क्योंकि रिपोर्ट करेंगे, aऔर xसूची प्रक्रियाओं अलावा अन्य तरीकों से मिलान किया प्रक्रियाओं के सेट करने के लिए।
जीववाद

@Animism सच। धन्यवाद, मैंने इसे ठीक किया।
एंड्रियास फ्रिशे

यह तभी काम करता है जब प्रक्रिया का नाम बिल्कुल निर्दिष्ट हो। यह एक आंशिक मैच के लिए काम नहीं करता है, उदाहरण के logindलिए systemd-logind, या तर्कों का मिलान करने के लिए।
एक्यूमेनस

4

एक और विकल्प :

ps -fC terminal

यहाँ विकल्प हैं:

 -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
एक छोटी सी खामी, और जो वास्तव में ओपी के सवाल से संबंधित नहीं है, वह यह है कि यह आपको टॉमकैट जैसी चीजों को नहीं दिखाएगा, जो वास्तव में तर्कों की कपड़े धोने की सूची के साथ जावा के रूप में चलाया जाता है।
चार्ल्स वुड

-Cविकल्प पहले से ही @Andreas Frishe के उत्तर में डेढ़ साल पहले पोस्ट किया गया था ...
Piotr Dobrogost

3

खोज पैटर्न में एक चरित्र को घेरने के लिए कोष्ठक का उपयोग करना grepप्रक्रिया को बाहर करता है क्योंकि इसमें मिलान रेगेक्स नहीं होता है।

$ 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

अस्वीकरण: मैं इस उपकरण का लेखक हूं, लेकिन ...

मैं 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

एक समझदार कमांड लाइन इंटरफेस के साथ प्रक्रियाओं को खोजने के अलावा यह कई अन्य उपयोगी चीजें भी करता है, परियोजना पृष्ठ पर अधिक विवरण ।

आसानी से स्थापित लिनक्स और ओएस एक्स पर काम करता है:

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

0

अंतिम उपयोग के मामले के आधार पर, आप अक्सर इसके बजाय अवाक को प्राथमिकता देना चाहते हैं।

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

यह विशेष रूप से सच है जब आपके पास कुछ ऐसा होता है

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

जहां स्पष्ट रूप से रेगीक्स को अवाक लिपि में तुच्छ रूप से चित्रित किया जा सकता है:

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

लेकिन वास्तव में, यह अपने आप को मजबूत नहीं है। pgrepऔर मित्र लंबे समय से आस-पास हैं और इस संपूर्ण समस्या स्थान को अधिकांश तदर्थ कार्यान्वयन से बेहतर तरीके से संभालते हैं।


-2

एक अन्य विकल्प यह है .bash_profileकि आप (या अन्य फ़ाइल जिसे आप एलियास बैश रखते हैं) को एक फ़ंक्शन बनाने के लिए संपादित करें जो कि परिणामों से बाहर 'greps' बनाती है।

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

alias grep='mygrep'

सबसे grep -v grepपहले होना चाहिए अन्यथा आपके --color=autoकिसी कारण के लिए काम नहीं करेगा।

यह काम करता है यदि आप बैश का उपयोग कर रहे हैं; यदि आप एक अलग शेल YMMV का उपयोग कर रहे हैं।


1
उपनाम और फ़ंक्शन के साथ क्या है ? बस function grep { command grep -v grep | command grep --color=auto "$@"; }(तर्क और उद्धरण के निर्धारण पर भी ध्यान दें)। हालाँकि, यह इस बात में टूट जाता है कि कोई भी गैर- psआह्वान grepअब काम नहीं करेगा (तर्क गलत तरीके से पारित किए जाते हैं)। वैसे भी, एक और अधिक उपयोगी समारोह फिल्टर बाहर एक जो वह खुद से मेल नहीं बनाने के लिए regex को संशोधित करता है, बजाय होगा grepसे grepअलग परिणाम है। और निश्चित रूप से, एक समस्या के नए समाधानों का आविष्कार करना जो दशकों पहले पर्याप्त रूप से हल हो गया था, बहुत उत्पादक नहीं है।
ट्रिपलए
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.