किसी विशिष्ट लाइन को कैसे gandp करें_और_ किसी फ़ाइल की पहली पंक्ति है?


76

एक साधारण grep मानकर जैसे:

$ psa aux | grep someApp
1000     11634 51.2  0.1  32824  9112 pts/1    SN+  13:24   7:49 someApp

यह बहुत जानकारी प्रदान करता है, लेकिन चूंकि पीएस कमांड की पहली पंक्ति गायब है, इसलिए जानकारी के लिए कोई संदर्भ नहीं है। मैं पसंद करूंगा कि ps की पहली पंक्ति को भी दिखाया जाए:

$ psa aux | someMagic someApp
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
1000     11634 51.2  0.1  32824  9112 pts/1    SN+  13:24   7:49 someApp

निश्चित रूप से, मैं विशेष रूप से ps के लिए grep में रेगेक्स जोड़ सकता हूं:

$ ps aux | grep -E "COMMAND|someApp"

हालाँकि, मैं अधिक सामान्य समाधान पसंद करूंगा क्योंकि अन्य मामले हैं जिनमें मैं पहली पंक्ति के साथ भी होना चाहूंगा।

ऐसा लगता है कि एक "stdmeta" फ़ाइल डिस्क्रिप्टर के लिए एक अच्छा उपयोग मामला होगा ।


9
इन उत्तरों के लिए आवश्यक जटिलता यह दर्शाती है कि "एक काम करो और इसे अच्छी तरह से करो" के यूनिक्स दर्शन कैसे कभी-कभी हमें असफलता के यार्ड स्टिक द्वारा मापा जाता है: इन सभी आदेशों को अच्छी तरह से जानते हुए उन्हें इस सामान्य समस्या पर लागू करने के लिए (फ़िल्टरिंग प्रक्रिया की जानकारी और अभी भी कॉलम लेबल को देखकर) दृष्टिकोण के नकारात्मक पक्ष को दर्शाता है: कभी-कभी चीजें बहुत सफाई से एक साथ फिट नहीं होती हैं। यही कारण है कि उपकरणों की तरह ackइतना उपयोगी होते हैं, और क्यों perlपहुंचा अतीत sed, awkआदि लोकप्रियता में: यह भागों एक सुसंगत पूरे में योग करने के लिए महत्वपूर्ण है।
आइकनोकॉस्ट

3
बेशक, इस विशेष उदाहरण के लिए, आप -Cतर्क का उपयोग कर सकते हैं psऔर आपको इसे grep में पाइप करने की आवश्यकता नहीं होगी। उदाहरण के लिए ps u -C someAppया यहां तक ​​किps u -C app1 -C app2 -C app3
कैस

1
@ डायनोसॉस्ट: निश्चित रूप से यूनिक्स समाधान एक ऐसा उपकरण होगा जो फिल्टर के विभिन्न सेट के माध्यम से फ़िल्टर की जाने वाली प्रत्येक लाइन को कई गुणा कर सकता है। ps aux | { head -1; grep foo; }नीचे @Nahuel Fouilleul द्वारा उल्लिखित एक सामान्यीकृत संस्करण Kinda (उनका शायद एकमात्र समाधान है कि मैं मौके पर याद करने में सक्षम हो सकता हूँ यदि आवश्यक हो)
रेयान

@ डायनोकॉस्ट: उपकरणों के साथ अनुभव कम होना, और ज्ञान, जो उपकरण वास्तव में अच्छा करते हैं, वे हमेशा पूरी तरह से बेकार लगेंगे। एक अच्छी तरह से कमांड को पता नहीं है कि प्रयोज्य के यार्ड स्टिक पर कहाँ है, यह ठीक मैनुअल और अभ्यास को पढ़ने के यार्ड स्टिक पर है। ये उपकरण दशकों से आसपास हैं। वे काम करते हैं और एक साथ बहुत अच्छी तरह से (और सफाई से) फिट होते हैं।
урослав Рахматуллин

@ УрославРахматуллин: मुझे लगता है कि आपने जो कहा, वह पूरी तरह से गलत हो सकता है। (शायद इसलिए कि अंग्रेजी आपकी पहली भाषा नहीं है?) "प्रयोज्यता" UX ("उपयोगकर्ता अनुभव") से संबंधित है उपयोगिता नहीं (या "उपयोगिता")। यह बताते हुए कि जब एक साधारण ऑपरेशन यह जटिल होता है, तो यह प्रयोज्य को नुकसान पहुँचाता है, यह कहने के लिए समान नहीं है कि उपकरण बेकार हैं। काफी स्पष्ट रूप से वे बेकार नहीं हैं। उनके सही दिमाग में कोई नहीं कहता कि वे बेकार हैं।
iconoclast

जवाबों:


67

अच्छा रास्ता

आम तौर पर आप इसे grep के साथ नहीं कर सकते हैं लेकिन आप अन्य उपकरणों का उपयोग कर सकते हैं। AWK का उल्लेख पहले ही किया जा चुका था लेकिन आप इसका उपयोग भी कर सकते हैं sed:

sed -e '1p' -e '/youpattern/!d'

यह काम किस प्रकार करता है:

  1. सैड उपयोगिता प्रत्येक पंक्ति पर व्यक्तिगत रूप से काम करती है, उनमें से प्रत्येक पर निर्दिष्ट कमांड चल रही है। आपके पास कई -eविकल्प निर्दिष्ट करते हुए, कई कमांड हो सकते हैं । हम प्रत्येक कमांड को एक सीमा पैरामीटर के साथ प्रस्तुत कर सकते हैं जो निर्दिष्ट करता है कि क्या यह कमांड विशिष्ट लाइन पर लागू होना चाहिए या नहीं।

  2. "Ip" एक पहली कमांड है। यह pकमांड का उपयोग करता है जो आम तौर पर सभी लाइनों को प्रिंट करता है । लेकिन हम इसे एक संख्यात्मक मूल्य के साथ प्रस्तुत करते हैं जो उस सीमा को निर्दिष्ट करता है जिसे इसे लागू किया जाना चाहिए। यहां, हम उपयोग करते हैं 1जिसका अर्थ है पहली पंक्ति। यदि आप अधिक लाइनें प्रिंट करना चाहते हैं, तो आप प्रिंट करने के लिए पहली लाइन x,ypकहां उपयोग कर सकते हैं x, प्रिंट करने के yलिए अंतिम लाइन है। उदाहरण के लिए पहले 3 पंक्तियों को प्रिंट करने के लिए, आप उपयोग करेंगे1,3p

  3. अगला कमांड वह है dजो सामान्य रूप से बफर से सभी लाइनों को हटा देता है। इस कमांड से पहले हम yourpatternदो /अक्षरों के बीच में रखते हैं । यह दूसरा तरीका है (पहले यह निर्दिष्ट करना था कि किन पंक्तियों को हमने pकमांड के साथ किया है ) उन पंक्तियों को संबोधित करते हुए जो कमांड को चलाने चाहिए। इसका मतलब है कि कमांड केवल उन लाइनों के लिए काम करेगा जो मैच करते हैं yourpattern। सिवाय, हम !चरित्र से पहले dकमांड का उपयोग करते हैं जो इसके तर्क को प्रभावित करता है। तो अब यह उन सभी लाइनों को हटा देगा जो निर्दिष्ट पैटर्न से मेल नहीं खाती हैं।

  4. अंत में, सीड बफर में छोड़ी गई सभी लाइनों को प्रिंट करेगा। लेकिन हमने उन लाइनों को हटा दिया जो बफर से मेल नहीं खाती हैं, इसलिए केवल मिलान वाली लाइनें मुद्रित की जाएंगी।

योग करने के लिए: हम 1 लाइन प्रिंट करते हैं, फिर हम उन सभी लाइनों को हटा देते हैं जो इनपुट से हमारे पैटर्न से मेल नहीं खाती हैं। लाइनों के बाकी (ताकि केवल लाइनों कि मुद्रित कर रहे हैं करने के आकार से मिलान)।

पहली पंक्ति की समस्या

जैसा कि टिप्पणियों में उल्लेख किया गया है, इस दृष्टिकोण के साथ एक समस्या है। यदि निर्दिष्ट पैटर्न पहली पंक्ति से मेल खाता है, तो इसे दो बार मुद्रित किया जाएगा (एक बार pकमांड द्वारा और एक बार मैच के कारण)। हम इससे दो तरह से बच सकते हैं:

  1. के 1dबाद कमांड जोड़ना 1p। जैसा कि मैंने पहले ही उल्लेख किया है, dकमांड बफर से लाइनों को हटाता है और हम निर्दिष्ट करते हैं कि यह संख्या 1 से है, जिसका अर्थ है कि यह केवल 1 लाइन को हटा देगा। तो आज्ञा होगीsed -e '1p' -e '1d' -e '/youpattern/!d'

  2. 1bइसके बजाय, कमांड का उपयोग करना 1p। यह एक चाल है। bकमांड हमें एक लेबल द्वारा निर्दिष्ट अन्य कमांड पर कूदने की अनुमति देता है (इस तरह कुछ कमांड को छोड़ा जा सकता है)। लेकिन अगर यह लेबल निर्दिष्ट नहीं है (जैसा कि हमारे उदाहरण में) यह केवल कमांड के अंत में कूदता है, हमारी लाइन के लिए बाकी कमांड को अनदेखा करता है। तो हमारे मामले में, अंतिम dकमांड बफर से इस लाइन को नहीं हटाएगी।

पूर्ण उदाहरण:

ps aux | sed -e '1b' -e '/syslog/!d'

अर्धविराम का उपयोग करना

कुछ sedकार्यान्वयन कई -eविकल्पों का उपयोग करने के बजाय अलग-अलग कमांड के लिए अर्धविराम का उपयोग करके आपको कुछ टाइपिंग बचा सकते हैं। इसलिए यदि आप पोर्टेबल होने की परवाह नहीं करते हैं तो कमांड होगी ps aux | sed '1b;/syslog/!d'। यह कम से कम GNU sedऔर busyboxकार्यान्वयन में काम करता है ।

पागल तरीका है

हालांकि, यहाँ grep के साथ ऐसा करने के लिए पागल तरीका है। यह निश्चित रूप से इष्टतम नहीं है, मैं इसे केवल सीखने के उद्देश्यों के लिए पोस्ट कर रहा हूं, लेकिन आप इसका उपयोग उदाहरण के लिए कर सकते हैं, यदि आपके पास अपने सिस्टम में कोई अन्य उपकरण नहीं है:

ps aux | grep -n '.*' | grep -e '\(^1:\)\|syslog'

यह काम किस प्रकार करता है

  1. सबसे पहले, हम -nप्रत्येक पंक्ति से पहले लाइन नंबर जोड़ने के लिए विकल्प का उपयोग करते हैं। हम उन सभी लाइनों को सुन्न करना चाहते हैं जिन्हें हम मेल कर रहे हैं .*- कुछ भी, यहां तक ​​कि खाली लाइन भी। जैसा कि टिप्पणियों में सुझाया गया है, हम '^' का भी मिलान कर सकते हैं, परिणाम समान है।

  2. तब हम विस्तारित नियमित अभिव्यक्तियों का उपयोग कर रहे हैं ताकि हम \|विशेष चरित्र का उपयोग कर सकें जो OR के रूप में काम करता है। तो हम मेल खाते हैं यदि रेखा के साथ शुरू होता है 1:(पहली पंक्ति) या इसमें हमारा पैटर्न होता है (इस मामले में इसका syslog)।

लाइन नंबर की समस्या

अब समस्या यह है, हम अपने उत्पादन में यह बदसूरत लाइन नंबर प्राप्त कर रहे हैं। यदि यह एक समस्या है, तो हम उन्हें cutइस तरह से दूर कर सकते हैं :

ps aux | grep -n '.*' | grep -e '\(^1:\)\|syslog' | cut -d ':' -f2-

-dविकल्प सीमांकक निर्दिष्ट करता है, -fउन क्षेत्रों (या स्तंभों) को निर्दिष्ट करता है जिन्हें हम प्रिंट करना चाहते हैं। इसलिए हम प्रत्येक :वर्ण पर प्रत्येक रेखाओं को काटना चाहते हैं और केवल 2nd और उसके बाद के सभी स्तंभों को प्रिंट करना चाहते हैं। यह प्रभावी रूप से पहला कॉलम हटाता है जिससे यह सीमांकित होता है और यह ठीक वैसा ही है जैसा हमें चाहिए।


4
लाइन नंबरिंग के साथ भी किया जा सकता है cat -nऔर इस के लिए एक grep दुरुपयोग के साथ के रूप में स्पष्ट दिखेगा।
13

1
nlखाली लाइनों की गणना नहीं करता है (लेकिन उन्हें बिना लाइन नंबर के प्रिंट करता है), cat -nपूर्ववर्ती रिक्त स्थान के साथ नंबर को प्रारूपित करता है, grep -n .बिल्कुल खाली लाइनों को स्ट्रिप करता है और एक कोलोन जोड़ता है। सभी ने अपने ... एर ... फीचर्स; ;-)
Alfe

2
बहुत शैक्षिक अच्छी तरह से लिखित जवाब। मैंने आपके लिए "प्रेपेंड" (शुरुआत के पास) को "प्रेपेंड" से बदलने की कोशिश की, लेकिन यह अधिक परिवर्तन चाहता था और मुझे आपकी पोस्ट में यादृच्छिक बकवास बदलने का मन नहीं था, इसलिए आप इसे ठीक करना चाह सकते हैं।
बिल के

2
ps aux | sed '1p;/pattern/!d'पैटर्न से मेल खाने पर पहली पंक्ति को दो बार प्रिंट करेगा । bकमांड का उपयोग करने के लिए सबसे अच्छा है ps aux | sed -e 1b -e '/pattern/!d':। cat -nPOSIX नहीं है grep -n '^'हर पंक्ति को संख्या देगा (पीएस आउटपुट के लिए कोई समस्या नहीं है जिसके पास खाली लाइनें नहीं हैं)। nl -ba -d $'\n'हर लाइन नंबर।
स्टीफन चेजलस

2
ध्यान दें कि 1b;...पोर्टेबल नहीं है और न ही POSIX, "b" के बाद कोई अन्य कमांड नहीं हो सकता है, इसलिए आपको एक नई पंक्ति या अन्य -e अभिव्यक्ति की आवश्यकता है।
स्टीफन चेज़लस

58

आप awkइसके बजाय उपयोग करने के बारे में कैसा महसूस करते हैं grep?

chopper:~> ps aux | awk 'NR == 1 || /syslogd/'
USER              PID  %CPU %MEM      VSZ    RSS   TT  STAT STARTED      TIME COMMAND
root               19   0.0  0.0  2518684   1160   ??  Ss   26Aug12   1:00.22 /usr/sbin/syslogd
mrb               574   0.0  0.0  2432852    696 s006  R+    8:04am   0:00.00 awk NR == 1 || /syslogd/
  • NR == 1: रिकॉर्ड की संख्या == 1; अर्थात। पहली पंक्ति
  • ||:
  • /syslogd/: के लिए खोज करने के लिए पैटर्न

यह देखने लायक भी हो सकता है pgrep, हालांकि यह उपयोगकर्ता-सामना आउटपुट के बजाय स्क्रिप्ट के लिए अधिक है। यह grepकमांड को आउटपुट में प्रदर्शित होने से रोकता है , हालाँकि।

chopper:~> pgrep -l syslogd
19 syslogd

बहुत अच्छा धन्यवाद। यह भविष्य के विस्तार के लिए अच्छी तरह से स्क्रिप्ट योग्य भी है।
14

मुझे कुछ जागने की जरूरत है। बहुत अच्छा।
user606723

30
ps aux | { read line;echo "$line";grep someApp;}

EDIT: टिप्पणियों के बाद

ps aux | { head -1;grep someApp;}

मैं हालांकि head -1सभी इनपुट को पढ़ूंगा, लेकिन परीक्षण के बाद, यह भी काम करता है।

{ head -1;grep ok;} <<END
this is a test
this line should be ok
not this one
END

आउटपुट है

this is a test
this line should be ok

2
इस विचार को सीधे ही मार दिया गया। मैं इसके लिए एक से अधिक अंगूठे देना चाहूंगा। { IFS='' read line; ... }अगर हेडर रिक्त स्थान से शुरू होता है तो मैं शायद इसका उपयोग करूंगा ।
अल्फ

यह सीधे समस्या पर हमला करता है । अच्छा!
डिटानचेन

3
मैं सिर्फ head -1पढ़ने / इको कॉम्बो के बजाय उपयोग करूँगा ।
चेपनर

1
खैर, यह head -n1मेरे बैश पर काम करता है । यह संभवतः कार्यान्वयन विशिष्ट हो सकता है। मेरा सिर इस मामले में पूरे इनपुट को नहीं पढ़ रहा है, केवल पहली पंक्ति, उनमें से बाकी इनपुट बफर में छोड़ रहा है।
Krzysztof Adamski

2
head -n1कम है, लेकिन यह भी लगता है कि पोसिक्स कल्पना भी चुप है कि इसके इनपुट को कितना पढ़ने की अनुमति है, इसलिए शायद read line; echo $lineसभी के बाद अधिक पोर्टेबल है।
शेपनर

14

Ps समर्थन आंतरिक फ़िल्टर,

मान लीजिए कि आप बैश प्रक्रिया की तलाश में हैं:

ps -C bash -f

उस नाम की सभी प्रक्रिया को सूचीबद्ध करेगा bash


धन्यवाद, यह जानकर अच्छा लगा। हालाँकि, यह स्क्रिप्ट को अन्य लोगों के बीच अजगर से शुरू नहीं मिलेगा।
१२:३२ पर डॉटान्कोन

6

मैं हेडर भेजने के लिए जाते हैं stderr :

ps | (IFS= read -r HEADER; echo "$HEADER" >&2; cat) | grep ps

यह आमतौर पर मानव पढ़ने के उद्देश्यों के लिए पर्याप्त है। उदाहरण के लिए:

  PID TTY          TIME CMD
 4738 pts/0    00:00:00 ps

सामान्य उपयोग के लिए ब्रैकेट वाला हिस्सा अपनी स्क्रिप्ट में जा सकता है।

इसमें एक अतिरिक्त सुविधा है कि आउटपुट को आगे बढ़ाया जा सकता है ( sortआदि) और हेडर शीर्ष पर रहेगा।


5

आप भी इस्तेमाल कर सकते हैं teeऔर head:

ps aux | tee >(head -n1) | grep syslog

ध्यान दें कि जब तक संकेतों teeको अनदेखा करने में असमर्थ है SIGPIPE(उदाहरण के लिए यहां चर्चा देखें ) इस दृष्टिकोण को विश्वसनीय होने के लिए वर्कअराउंड की आवश्यकता है। समाधान SIGPIPE संकेतों को अनदेखा करना है, उदाहरण के लिए इसे इस तरह से किया जा सकता है जैसे गोले:

trap '' PIPE    # ignore SIGPIPE
ps aux | tee >(head -n1) 2> /dev/null | grep syslog
trap - PIPE     # restore SIGPIPE handling

यह भी ध्यान दें कि आउटपुट ऑर्डर की गारंटी नहीं है


मैं काम करने के लिए इस पर भरोसा नहीं करता, पहली बार जब मैंने इसे (zsh) चलाया तो इसने grep परिणामों के नीचे कॉलम हेडर का उत्पादन किया। दूसरी बार ठीक था।
राकोमी

1
मैं अभी तक यह नहीं देखा है, लेकिन एक तरह से विश्वसनीयता को बढ़ाने के लिए करने से पहले पाइप लाइन में थोड़ा विलंब डालने के लिए है grep: | { sleep .5; cat }
थोर

2
समसामयिक समस्याओं से बचने के लिए नींद जोड़ना हमेशा हैक होता है। हालांकि यह काम कर सकता है, यह अंधेरे पक्ष की ओर एक कदम है। -1 इसके लिए।
अल्फ

1
इस उत्तर को
आजमाते

यह टी का एक दिलचस्प उपयोग है, लेकिन मुझे यह अविश्वसनीय लगता है और अक्सर केवल आउटपुट लाइन प्रिंट करता है, लेकिन हेडर लाइन नहीं।
१२:३२ पर डॉटान्कोन

4

शायद दो psकमांड आसान होगी।

$ ps aux | head -1 && ps aux | grep someApp
USER             PID  %CPU %MEM      VSZ    RSS   TT  STAT STARTED      TIME COMMAND
100         3304   0.0  0.2  2466308   6476   ??  Ss    2Sep12   0:01.75 /usr/bin/someApp

2
मुझे यह समाधान पसंद नहीं है, मुख्यतः क्योंकि पहली और दूसरी ps auxकॉल के बीच स्थिति बदल सकती है ... और अगर आप बस उस स्थिर पहली पंक्ति को चाहते हैं, तो इसे मैन्युअल रूप से क्यों नहीं गूँजते?
शादुर

1
इस स्थिति में दो कॉल के बीच परिवर्तन को परेशान नहीं किया जाना चाहिए । पहला केवल हेडलाइन प्रदान करेगा जो हमेशा दूसरे के आउटपुट में फिट होगा।
अल्फ

2
मैं नहीं देखता कि इसे क्यों उतारा गया, यह निश्चित रूप से एक व्यवहार्य विकल्प है। Upvoting।
dotancohen

4

आप के साथ pidstat का उपयोग कर सकते हैं:

pidstat -C someApp
or
pidstat -p <PID>

उदाहरण:

# pidstat -C java
Linux 3.0.26-0.7-default (hostname)    09/12/12        _x86_64_

13:41:21          PID    %usr %system  %guest    %CPU   CPU  Command
13:41:21         3671    0.07    0.02    0.00    0.09     1  java

आगे की जानकारी: http://linux.die.net/man/1/pidstat


धन्यवाद, यह जानकर अच्छा लगा। हालाँकि, यह स्क्रिप्ट को अन्य लोगों के बीच अजगर से शुरू नहीं मिलेगा।
डॉटेंकहेन

4

अपने .bashrc फ़ाइल में निम्नलिखित को डालें या परीक्षण के लिए पहले शेल में कॉपी / पेस्ट करें।

function psls { 
ps aux|head -1 && ps aux|grep "$1"|grep -v grep;
}

उपयोग: psls [grep पैटर्न]

$ psls someApp
USER             PID  %CPU %MEM      VSZ    RSS   TT  STAT STARTED      TIME COMMAND
root              21   0.0  0.0  2467312   1116   ??  Ss   Tue07PM   0:00.17 /sbin/someApp

अपने .bashrc (या .bash_profile को अगर आप इसे उसके स्थान पर रखते हैं, तो) सुनिश्चित करें:

source ~/.bashrc

फ़ंक्शन शेल कमांड लाइन पर भी ऑटो-पूर्ण होगा। जैसा कि आपने एक अन्य उत्तर में कहा है, आप पीएस को एक कॉल बचाने के लिए पहली पंक्ति को एक फ़ाइल में पाइप कर सकते हैं।


1
अच्छा, मैं वर्षों से उस तरह के फ़ंक्शन का उपयोग कर रहा हूं। मैं अपने संस्करण कोpsl कॉल करता हूं , जो केवल कॉल करता है psऔर grepएक बार प्रत्येक (और इसकी आवश्यकता नहीं है head)।
एडम काट्ज

3

सॉर्ट करें लेकिन शीर्ष लेख को शीर्ष पर रखें

# print the header (the first line of input)
# and then run the specified command on the body (the rest of the input)
# use it in a pipeline, e.g. ps | body grep somepattern
body() {
    IFS= read -r header
    printf '%s\n' "$header"
    "$@"
}

और इसे इस तरह से उपयोग करें

$ ps aux | body grep someApp
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
1000     11634 51.2  0.1  32824  9112 pts/1    SN+  13:24   7:49 someApp

धन्यवाद, उन जवाबों में से कुछ इस सवाल के सामान्य मामले पर चर्चा करते हैं। उत्तम!
डॉटनचेन

3

Comp.unix.shell में ज्यादातर Janis Papanagnou को धन्यवाद, मैं निम्नलिखित फ़ंक्शन का उपयोग करता हूं:

function grep1 {
    IFS= read -r header && printf "%s\n" "$header"; grep "$@"
}

इसके कई फायदे हैं:

  • बैश, zsh, और शायद ksh के साथ काम करता है
  • यह grep के लिए एक ड्रॉप-इन प्रतिस्थापन है, इसलिए आप जो चाहें झंडे का उपयोग करना जारी रख सकते हैं: -iकेस-असंवेदनशील मिलान के लिए, -Eविस्तारित रेगेक्स के लिए, आदि।
  • जीआरपी के रूप में हमेशा एक ही एग्जिट कोड प्राप्त होता है, यदि आप प्रोग्रामेटिक रूप से यह निर्धारित करना चाहते हैं कि क्या कोई रेखा वास्तव में मेल खाती है
  • यदि इनपुट खाली था तो कुछ भी प्रिंट नहीं करता है

उपयोग उदाहरण:

$ ps -rcA | grep1 databases
  PID TTY           TIME CMD

$ ps -rcA | grep1 -i databases
  PID TTY           TIME CMD
62891 ??         0:00.33 com.apple.WebKit.Databases

2

इसके साथ एक और तरीका gnu ed:

ed -s '!ps aux' <<< $'2,$v/PATTERN/d\n,p\nq\n'

या, यदि शेल प्रक्रिया प्रतिस्थापन का समर्थन करता है:

printf '%s\n' '2,$v/PATTERN/d' ,p q | ed -s <(ps aux)

अर्थात्:

2,$v/PATTERN/d  - remove all lines not matching pattern (ignore the header)
,p              - print the remaining lines
q               - quit

अधिक पोर्टेबल, बिना gnu '!' या शेल प्रतिस्थापन - केवल बफर में आउटपुट का edनिर्माण rकरने के लिए अंतर्निर्मित का उपयोग करना और फिर सीमा में गैर-मिलान लाइनों को हटाना और परिणाम प्रिंट करना:rps aux2,$

printf '%s\n' 'r !ps aux' '2,$v/PATTERN/d' ,p q | ed -s

और जब से sedस्वीकार किए गए उत्तर आउटपुट में कमांड भी लाइन का मिलान करता है, sedउस समर्थन के साथ -f-और एक शेल जो प्रक्रिया प्रतिस्थापन का समर्थन करता है जो मैं चलाऊंगा:

printf '%s\n' '2,${' '/PATTERN/!d' '}' | sed -f - <(ps aux)

जो बहुत ज्यादा पिछले edआदेशों के रूप में एक ही बात करता है ।


1

पर्ल रास्ता:

ps aux | perl -ne 'print if /pattern/ || $.==1'

जिस तरह से पढ़ने में आसान sed, तेज, अवांछित लाइनों को लेने का कोई जोखिम नहीं है।



0

यदि यह केवल पूर्ण शीर्षलेखों के साथ प्रक्रिया को पूरा करने के लिए है, तो मैं @ mrb के सुझाव का विस्तार करूंगा:

$ ps -f -p $(pgrep bash)
UID        PID  PPID  C STIME TTY      STAT   TIME CMD
nasha     2810  2771  0  2014 pts/6    Ss+    0:00 bash
...

pgrep bash | xargs ps -fpएक ही परिणाम मिल जाएगा, लेकिन एक उपधारा के बिना। यदि अन्य स्वरूपण आवश्यक है:

$ pgrep bash | xargs ps fo uid,pid,stime,cmd -p
  UID   PID STIME CMD
    0  3599  2014 -bash
 1000  3286  2014 /bin/bash
 ...

-2

यदि आप सटीक लाइन संख्या जानते हैं, तो यह पर्ल के साथ आसान है! यदि आप किसी फ़ाइल से पंक्ति 1 और 5 प्राप्त करना चाहते हैं, तो / etc / passwd कहें:

perl -e 'while(<>){if(++$l~~[1,5]){print}}' < /etc/passwd

यदि आप अन्य लाइनें भी प्राप्त करना चाहते हैं, तो केवल सरणी में उनकी संख्या जोड़ दें।


1
धन्यवाद। ओपी के अनुसार, मैं लाइन में कुछ पाठ जानता हूं, लेकिन लाइन नंबर नहीं।
dotancohen

यह Google पर एक जवाब के रूप में पॉप अप करता है, जब इस उपयोग के मामले को ओपी के साथ निकटता से जुड़ा हुआ है, इसलिए यहां ध्यान देने योग्य है।
दागेल

1
यदि ऐसा है, तो मैं अत्यधिक सुझाव देता हूं कि आप एक नया प्रश्न शुरू करें और इस उत्तर के साथ उत्तर दें। एसई पर अपने स्वयं के प्रश्नों का उत्तर देना पूरी तरह से ठीक है, खासकर उस स्थिति में जिसका आप उल्लेख करते हैं। आगे बढ़ो और ओपी पर एक टिप्पणी में अपने नए प्रश्न से लिंक करें।

ऐसे सवाल हैं, लेकिन वे वर्तमान में Google पर पॉप अप नहीं करते हैं।
डेगवे

Dagelf, निचला रेखा है - आपका उत्तर यहां प्रश्न का उत्तर नहीं देता है। @dotancohen सही है - यदि यह ओपी के साथ निकटता से संबंधित इस उपयोग के मामले की तलाश करते समय Google पर एक जवाब के रूप में पॉप अप करता है, तो एक अलग प्रश्न पूछें - उस निकट संबंधित उपयोग मामले का विवरण - और इसका उत्तर दें।
13
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.