शेल में `|` प्रतीक का अर्थ क्या है?


16

आदेश |में प्रतीक का क्या अर्थ है sudo ps -ef | grep processname?

किसी को भी इस आदेश की व्याख्या कर सकते हैं? मैंने इस कमांड का उपयोग केवल PID प्राप्त करने और उस प्रक्रिया को मारने के लिए किया है, लेकिन मैंने भी देखा sudo ps -ef | grep processname | grep -v grepऔर मैं इस धारणा के तहत हूं कि -v grepपिछले जनरेट किए गए PID को मारने जैसा है grep। यदि ऐसा है तो यह कैसे काम करता है?


4
आपको sudoचलाने की आवश्यकता नहीं है ps -ef। तीसरी कमांड से बचने के लिए एक सामान्य ट्रिक भी वर्ग कोष्ठक में प्रक्रिया के नाम के एक चरित्र को संलग्न कर रही है:ps -ef | grep [p]rocessname
kos

1
@kos उस कमांड को मज़बूती से काम करने के लिए उद्धरणों की आवश्यकता है:ps -ef | grep '[p]rocessname'
kasperd

2
@kos यदि आप लिखते हैं grep [p]rocessname, तो आप शेल को वर्तमान निर्देशिका में फ़ाइल को देखने के लिए नाम के साथ बता रहे हैं processnameऔर उस फ़ाइल के नाम के साथ पैटर्न को प्रतिस्थापित करते हैं। यदि कोई फ़ाइल नाम processnameमौजूद नहीं है, तो शेल पैटर्न को वस्तुतः grep कर सकता है। लेकिन यह आपकी सेटिंग्स पर निर्भर करता है। तो अपने संस्करण नाम की एक फ़ाइल है, तो टूट जाएगा processnameमौजूद है या निम्नलिखित खोल कोई भी विकल्प सक्षम किया गया है failglob, nullglob, nocaseglob
कैस्परल्ड

1
@kasperd मैंने आपकी पिछली टिप्पणी को गलत बताया, हां, आप हर चीज के बारे में सही हैं। मैंने ऐसा नहीं माना।
कोस

1
मुझे विश्वास नहीं हो रहा है कि यह डुप्लिकेट नहीं है।
मस्त

जवाबों:


13
ps -ef | grep processname

यह पहले sudo ps -efआउटपुट को चलाता है और दूसरे कमांड को आउटपुट देता है।

दूसरी कमांड उन सभी लाइनों को फ़िल्टर करती है जिनमें "प्रक्रियानाम" शब्द है।

ps -ef | grep processname | grep -v grepयुक्त processnameऔर नहीं युक्त सभी लाइनों को सूचीबद्ध करता है grep

इसके अनुसार man grep

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

इसके अनुसार 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.

आप पैरामीटर को -efसमान रूप से संयोजित कर सकते हैं -e -f

वास्तव में ps -ef | grep processnameबुलाया प्रक्रिया की सभी घटनाओं की सूची processname


स्पष्टीकरण के लिए धन्यवाद, ps -efवास्तव में क्या करता है ??
आमिर

मुझे लगता है कि जब हम | grep processNameटर्मिनल में दौड़ते हैं तो हमें grep का आउटपुट भी मिलता है, जो स्वयं एक प्रक्रिया है -v इस आउटपुट को मारता है
Aamir

तुम सही हो।
पायलट 6

35

इसे कहते हैं pipe। यह पहली कमांड के आउटपुट को दूसरी कमांड के इनपुट के रूप में देता है।

आपके मामले में इसका मतलब है:
के परिणाम के sudo ps -efइनपुट के रूप में खिलाया जाता हैgrep processname

sudo ps -ef:
यह चल रही सभी प्रक्रियाओं को सूचीबद्ध करता है। man psअधिक के लिए शब्दावली में लिखें ।

grep processname
तो, प्रक्रियाओं की इस सूची को grep में खिलाया जाता है जो केवल परिभाषित कार्यक्रम के लिए खोजता है programname

उदाहरण

sudo ps -ef | grep firefoxमेरे टर्मिनल रिटर्न में टाइपिंग :

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

ठीक है, क्या -v grep, यह क्या करता है।
आमिर

अच्छा विवरण लेकिन मुझे कुछ -v grep कार्यों में मदद की ज़रूरत है ..
आमिर

ओह, मैं देख रहा हूँ कि क्यों grep -vप्रयोग किया जाता है। अंतिम पंक्ति को फ़िल्टर करने के लिए।
पायलट ६

@ आमिर मेरा जवाब देखिए। grep -vपैटर्न युक्त OUT लाइनों को फ़िल्टर करता है।
पायलट ६

1
आप यह भी जोड़ सकते हैं कि आप कई पाइप का उपयोग कर सकते हैं। जैसे गूंज "फोबार" | grep फू | grep बार
माइकल

7

Im कोशिश करते हैं और एक सीधे आगे के प्रैक्टिकल जवाब के साथ इसका जवाब देते हैं:

पाइप |आपको शेल में भयानक सामान करने देता है! यह एक एकल ऑपरेटर है जिसे मैं सबसे उपयोगी और शक्तिशाली मानता हूं।

कैसे एक निर्देशिका में फ़ाइलों की गिनती के बारे में? सरल:

ls | wc -l.. लाइनों के lsलिए wcबुद्धि पैरामीटर के उत्पादन को अप्रत्यक्ष-l

या एक फ़ाइल में लाइनों की गिनती?

cat someFile | wc -l

क्या होगा अगर मैं कुछ खोजना चाहता हूँ? 'grep' तार की घटनाओं की खोज कर सकता है:

cat someFile | grep aRandomStringYouWantToSearchFor

आप बस पाइप के बाएं कमांड के आउटपुट को कमांड के दाईं ओर पाइप के रीडायरेक्ट करते हैं।

एक और स्तर: एक फ़ाइल में कितनी बार कुछ होता है?

cat someFile | grep aRandomStringYouWantToSearchFor | wc -l

आप उपयोग कर सकते हैं | लगभग सब कुछ के लिए :)

fortune | cowsay

यहाँ छवि विवरण दर्ज करें


2
हां, पाइप मजेदार हैं, +1, लेकिन कृपया उदाहरण बदलें: UUOC
कोस

जैसे: grep -c "aRandomStringYouWantToSearchFor" "someFile";-)
साडी

ऑप्टिकल फाइबर केबल। लेकिन सादगी के उद्देश्य से ... प्रश्नकर्ता को grep में अधिक गहरा नहीं लगता, जैसे :)
Gewure

1
स्पष्ट रूप से आपके बहुत से उदाहरणों को पाइप की आवश्यकता नहीं है। क्या आपने डीमोगिफिकेशन के बारे में सुना है? आप बिल्ली और पाइप का उपयोग कर रहे हैं जब कई कमांड फाइलों को सीधे मापदंडों के रूप में ले जाएंगे: उदाहरण के लिए बिल्ली someFile | grep aRandomStringYouWantToSearchFor को grep होना चाहिए aRandomStringYouWantToSearchFor someFile
कप्तान

दोस्तों .. मुझे पता है यदि आप टिप्पणियों को पढ़ते हैं, तो कप्तान, आपने मेरी प्रतिक्रिया पढ़ी होगी। जिस व्यक्ति ने सवाल पूछा, वह पाइप के वास्तविक अनुप्रयोगों को नहीं समझेगा - उसे यह भी नहीं पता है कि जीआरपी क्या है। तो क्या मैं उसे इसका उदाहरण दूं? kill $(ps aux | awk '/someString/ { print $2}' | sed -n '1p') नहीं, कारण यह उद्देश्य पूरा नहीं करेगा।
ग्योर्योर

4

मैंने इस कमांड का उपयोग केवल PID प्राप्त करने और उस प्रक्रिया को मारने के लिए किया है

अन्य उत्तरों ने आपके मुख्य प्रश्न का उत्तर पहले ही दे दिया है, लेकिन मैं इसे भी संबोधित करना चाहूंगा;

सामान्य तौर पर हत्या की प्रक्रिया में अक्सर एक ओवरकिल होता है और एक गड़बड़ अवस्था में चारों ओर एक प्रक्रिया द्वारा आवंटित संसाधनों को छोड़ देता है, आप अक्सर इसे समाप्त कर सकते हैं ;

इसके अलावा, बस pkillएक प्रक्रिया को मारने / समाप्त करने के लिए उपयोग करें। pkillएक सटीक प्रक्रिया नाम या एक नियमित अभिव्यक्ति निर्दिष्ट करने का समर्थन करता है:

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
kill -9जब तक आप विशेष रूप से नहीं जानते कि कोई अन्य संकेत काम नहीं करेगा तब तक उपयोग न करें । Iki.fi/era/unix/award.html#kill
tripleee

@tripleee ओपी ने कहा कि वे हालांकि इस प्रक्रिया को मारना चाहते हैं ।
कोस

वही killकरता है। निर्दिष्ट करना -9एक अतिरिक्त और सबसे अक्सर विनाशकारी अतिरिक्त विकल्प है।
ट्रिपलए

@ ट्रिपली का मानना ​​है कि शब्दावली के कारण भ्रम पैदा हो रहा है; मुझे मारने के लिए = SIGKILL, SIGTERM नहीं।
कोस

ज्यादातर लोगों के लिए, मैं "मार" का मतलब kill, सादे और सरल होने की उम्मीद करूंगा । कोई भी शब्दावली एक तरफ, आपके उत्तर को लोगों को -9विकल्प का उपयोग करने की सलाह नहीं देनी चाहिए जब तक कि आप एक भावपूर्ण चेतावनी में नहीं डालते हैं।
ट्रिपलए
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.