কোনও ফাইলের প্রথম লাইনে একটি নির্দিষ্ট লাইন গ্রেপ কিভাবে করবেন?


76

একটি সাধারণ গ্রেপ যেমন:

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

এটি অনেক তথ্য সরবরাহ করে, তবে পিএস কমান্ডের প্রথম লাইনটি অনুপস্থিত থাকায় তথ্যের কোনও প্রসঙ্গ নেই। আমি পছন্দ করি পিএস এর প্রথম লাইনটিও প্রদর্শিত হবে:

$ 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 aux | grep -E "COMMAND|someApp"

তবে আমি আরও সাধারণ সমাধান পছন্দ করবো কারণ অন্যান্য ক্ষেত্রেও আমি প্রথম লাইনে থাকতে চাই।

এটি "stdmeta" ফাইল বর্ণনাকারীর জন্য ভাল ব্যবহারের ক্ষেত্রে হবে বলে মনে হচ্ছে ।


9
এই উত্তরের দ্বারা প্রয়োজনীয় জটিলতাটি বোঝায় যে কীভাবে ইউনিক্স দর্শনের "একটি কাজ করুন এবং এটি ভালভাবে করুন" কখনও কখনও আমাদের ব্যর্থ হয় যখন ব্যবহারের আঙ্গিনা কাঠি দ্বারা পরিমাপ করা হয়: এই সাধারণ সমস্যাগুলিতে এগুলি প্রয়োগ করার জন্য এই সমস্ত আদেশগুলি যথেষ্ট পরিমাণে জেনে রাখা (ফিল্টারিং প্রক্রিয়া সম্পর্কিত তথ্য এবং এখনও কলাম লেবেলগুলি দেখা) পদ্ধতির খারাপ দিকটি দেখায়: কখনও কখনও জিনিস খুব পরিষ্কারভাবে একসাথে ফিট করে না। এই জন্যই সরঞ্জাম মত ackতাই দরকারী এবং কেন perlরকেটের গত sed, awkইত্যাদি জনপ্রিয়তা: এটা অংশের একটি সুসঙ্গত সমগ্র মধ্যে যোগফল করার জন্য গুরুত্বপূর্ণ।
আইকনোক্লাস্ট

3
অবশ্যই, এই নির্দিষ্ট উদাহরণের জন্য, আপনি এই -Cযুক্তিটি ব্যবহার করতে পারেন psএবং আপনাকে এটিকে গ্রেপের মধ্যে পাইপ দেওয়ার দরকার পড়বে না। যেমন ps u -C someAppবা এমনকিps u -C app1 -C app2 -C app3
কাস

1
@ আইকনোক্লাস্ট: অবশ্যই ইউনিক্সি দ্রবণটি এমন একটি সরঞ্জাম যা ফিল্টারগুলির বিভিন্ন সেটের মাধ্যমে ফিল্টার করার জন্য প্রতিটি একাধিক লাইন মাল্টিপ্লেক্স করতে পারে। কিন্ডা ps aux | { head -1; grep foo; }নীচে @ নাহুয়েল ফুইলুল দ্বারা উল্লিখিত একটি সাধারণ সংস্করণ (তাঁর সম্ভবত একমাত্র সমাধান যা আমি প্রয়োজনে ঘটনাস্থলে স্মরণ করতে সক্ষম হব)
লাই রায়ান

@ আইকনোক্লাস্ট: অভিজ্ঞতার অভাব এবং সরঞ্জামগুলির জ্ঞান, সরঞ্জামগুলি আসলে কী ভাল করে তা সর্বদা অকেজো বলে মনে হয়। কমান্ডটি ভালভাবে জানার মতো ব্যবহারের যোগ্যতাটি ইয়ার্ড স্টিকের কোথাও নেই, এটি সূক্ষ্ম ম্যানুয়াল এবং অনুশীলনটি পড়ার উঠানের কাঠিটিতে রয়েছে। এই সরঞ্জামগুলি প্রায় দশক ধরে রয়েছে। তারা খুব সুন্দর (এবং পরিষ্কারভাবে) একসাথে কাজ করে এবং ফিট করে।
19 Рахматуллин

@ ЯрославРахматуллин: আমি মনে করি আমি যা বলেছিলাম তা আপনি পুরোপুরি ভুল বুঝে থাকতে পারেন। (সম্ভবত ইংরেজী আপনার প্রথম ভাষা নয়?) "ব্যবহারযোগ্যতা" ইউএক্সের সাথে সম্পর্কিত ("ব্যবহারকারীর অভিজ্ঞতা") ইউটিলিটি নয় (বা "উপযোগিতা")। ইঙ্গিত করে যে কোনও সাধারণ অপারেশন যখন এই জটিল হয় তখন তা ব্যবহার্যকে ব্যাঘাত দেয় তবে সরঞ্জামগুলি অকেজো বলে বলার মতো নয় । বেশ স্পষ্টতই তারা অকেজো নয়। তাদের সঠিক মনে কেউ বলবে না যে তারা অকেজো।
আইকনোক্লাস্ট

উত্তর:


67

ভাল পথ

সাধারণত আপনি গ্রেপ দিয়ে এটি করতে পারবেন না তবে আপনি অন্যান্য সরঞ্জাম ব্যবহার করতে পারেন। এডাব্লু কে ইতিমধ্যে উল্লেখ করা হয়েছিল তবে আপনি এটি ব্যবহার করতে পারেন sed:

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

কিভাবে এটা কাজ করে:

  1. সেড ইউটিলিটি প্রতিটি লাইনে স্বতন্ত্রভাবে কাজ করে, তাদের প্রতিটিটিতে নির্দিষ্ট কমান্ড চালায় running বিভিন্ন -eবিকল্প নির্দিষ্ট করে আপনার একাধিক কমান্ড থাকতে পারে । আমরা প্রতিটি কমান্ডকে একটি পরিসীমা প্যারামিটার দিয়ে প্রেন্ডেন্ড করতে পারি যা নির্দিষ্ট করে রেখায় এই আদেশটি প্রয়োগ করা উচিত কিনা তা নির্দিষ্ট করে।

  2. "1 পি" প্রথম কমান্ড command এটি pকমান্ড ব্যবহার করে যা সাধারণত সমস্ত লাইন মুদ্রণ করে। তবে আমরা এটিকে এমন একটি সংখ্যাসূচক মান দিয়ে প্রেন্ডেন্ড করি যা এটি প্রয়োগ করতে হবে তার সীমাটি নির্দিষ্ট করে। এখানে, আমরা 1প্রথম লাইন যার অর্থ ব্যবহার করি । আপনি যদি আরও লাইন মুদ্রণ করতে চান তবে আপনি x,ypযেখানে xমুদ্রণের জন্য প্রথম লাইনটি ব্যবহার করতে পারেন , yএটি মুদ্রণের শেষ লাইন। উদাহরণস্বরূপ প্রথম 3 লাইন মুদ্রণ করার জন্য, আপনি ব্যবহার করবেন1,3p

  3. নেক্সট কমান্ড হ'ল dযা সাধারণত বাফার থেকে সমস্ত লাইন মুছে দেয়। এই কমান্ডের আগে আমরা yourpatternদুটি /অক্ষরের মধ্যে রেখেছি। pকমান্ডটি সঞ্চালিত হওয়া উচিত বলে সম্বোধন করার জন্য এটি অন্যভাবে (প্রথমটি হ'ল আমরা কমান্ডটি দিয়ে কোন লাইনগুলি নির্দিষ্ট করেছি ) addressing এর অর্থ হ'ল কমান্ডটি কেবল মিলিত লাইনের জন্য কাজ করবে 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বাস্তবায়নে কাজ করে।

পাগল উপায়

গ্রেপ দিয়ে এটি করার পরিবর্তে পাগল উপায় এখানে। এটি অবশ্যই সর্বোত্তম নয়, আমি এটি কেবল শিক্ষার উদ্দেশ্যে পোস্ট করছি তবে আপনি এটি উদাহরণস্বরূপ ব্যবহার করতে পারেন, যদি আপনার সিস্টেমে অন্য কোনও সরঞ্জাম না থাকে:

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

কিভাবে এটা কাজ করে

  1. প্রথমে আমরা -nপ্রতিটি লাইনের আগে লাইন নম্বর যুক্ত করতে বিকল্পটি ব্যবহার করি । আমরা যে সমস্ত লাইনের সাথে আমরা মেলেছি তার সমস্ত কিছু অঙ্ক করতে চাই .*- কিছু এমনকি খালি লাইনও। মন্তব্যে যেমন পরামর্শ দেওয়া হয়েছে, আমরা '^' এর সাথেও মেলাতে পারি, ফলাফল একই।

  2. তারপরে আমরা প্রসারিত নিয়মিত এক্সপ্রেশন ব্যবহার করছি যাতে আমরা \|বিশেষ চরিত্রটি ব্যবহার করতে পারি যা ওআর হিসাবে কাজ করে। সুতরাং লাইনটি 1:(প্রথম লাইন) দিয়ে শুরু হলে বা আমাদের প্যাটার্ন (এই ক্ষেত্রে এটির syslog) অন্তর্ভুক্ত থাকলে আমরা মেলে ।

লাইন নম্বর সমস্যা

এখন সমস্যাটি হচ্ছে, আমরা আমাদের আউটপুটে এই কুৎসিত লাইন নম্বর পাচ্ছি। যদি এটি কোনও সমস্যা হয় তবে আমরা এগুলি এগুলি দিয়ে সরাতে পারি cut:

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

-dবিকল্পটি ডিলিমিটার -fনির্দিষ্ট করে, ক্ষেত্রগুলি (বা কলাম) নির্দিষ্ট করে যা আমরা মুদ্রণ করতে চাই। সুতরাং আমরা প্রতিটি :চরিত্রের প্রতিটি লাইন কাটতে চাই এবং কেবল ২ য় এবং পরবর্তী সমস্ত কলাম মুদ্রণ করতে চাই। এটি কার্যকরভাবে ডিলিমিটার সহ প্রথম কলামটি সরিয়ে দেয় এবং এটি আমাদের প্রয়োজন ঠিক।


4
লাইন নম্বরও cat -nপাশাপাশি করা যেতে পারে এবং এর জন্য আপত্তিজনক গ্রেপের মতো আরও পরিষ্কার দেখাবে।
আলফ

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 -nপসিক্স নয়। grep -n '^'প্রতি লাইনে নম্বর দেবে (পিএস আউটপুটটির জন্য কোনও সমস্যা নয় যার খালি লাইন নেই)। nl -ba -d $'\n'প্রতি লাইনে সংখ্যা।
স্টাফেন চেজেলাস

2
নোট করুন যেটি 1b;...পোর্টেবল বা পসিক্স নয়, "বি" এর পরে আর কোনও আদেশ হতে পারে না, সুতরাং আপনার একটি নতুন লাইন বা অন্য -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

খুব সুন্দর ধন্যবাদ. এটি ভবিষ্যতের বিস্তারের জন্য দুর্দান্তভাবে স্ক্রিপ্টযোগ্য।
dotancohen

আমাকে কিছুটা বিশ্রী শিখতে হবে। খুব সুন্দর.
ব্যবহারকারী 606723

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

সম্পাদনা: মন্তব্য পরে

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; ... }শিরোনামটি স্পেস দিয়ে শুরু করার ক্ষেত্রে ব্যবহার করব ।
আলফ

এই আছে ঠিক সমস্যা সরাসরি আক্রমণ। নিস!
dotancohen

3
আমি কেবল head -1পঠন / ইকো কম্বোর পরিবর্তে ব্যবহার করব ।
চিপনার

1
ঠিক আছে, এটি head -n1আমার বাশ নিয়ে কাজ করে। এটি সম্ভবত নির্দিষ্টকরণ বাস্তবায়ন হতে পারে। আমার মাথা এই ক্ষেত্রে পুরো ইনপুটটি পড়ছে না, কেবল প্রথম লাইনে, বাকি অংশগুলি ইনপুট বাফারে রেখে leaving
ক্রিজিসটফ অ্যাডামস্কি

2
head -n1সংক্ষিপ্ত, তবে এটি প্রদর্শিত হয় এমনকি পসিক্স স্পেক এটির কতটা ইনপুট পড়ার অনুমতি দেয় তা সম্পর্কে নীরব, তাই সম্ভবত read line; echo $lineসর্বোপরি বহনযোগ্য।
চ্যানার

14

পিএস সমর্থন অভ্যন্তরীণ ফিল্টার,

মনে করুন আপনি বাশ প্রক্রিয়াটি সন্ধান করছেন:

ps -C bash -f

নামকরণ করা সমস্ত প্রক্রিয়া তালিকাবদ্ধ করবে bash


ধন্যবাদ, এটি জানতে পেরে ভাল লাগল। তবে এটি অন্যদের মধ্যে পাইথন থেকে শুরু হওয়া স্ক্রিপ্টগুলি খুঁজে পাবে না।
dotancohen

6

আমি হেডারকে স্টাডারে প্রেরণ করি :

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) এটি গ্রেপের ফলাফলের নীচে কলাম শিরোনাম তৈরি করে। দ্বিতীয়বার ঠিক ছিল।
Rqomey

1
আমি এখনো এই দেখা যায় না, কিন্তু এক উপায় নির্ভরযোগ্যতা বৃদ্ধি করার আগে পাইপলাইন একটি ছোট বিলম্ব সন্নিবেশ করতে হয় grep: | { sleep .5; cat }
থোর

2
সম্মতিযুক্ত সমস্যা এড়াতে ঘুম যুক্ত করা সর্বদা একটি হ্যাক। যদিও এটি কাজ করতে পারে, এটি অন্ধকার দিকের দিকে এক ধাপ। এই জন্য -1।
আলফ

1
এই উত্তরটি চেষ্টা করার সময় আমার কাছে আরও কয়েকটি অদ্ভুত সমস্যা ছিল, আমি যাচাই করার জন্য
রিকোমি

এটি টিয়ের একটি আকর্ষণীয় ব্যবহার, তবে আমি এটি অবিশ্বাস্য মনে করি এবং প্রায়শই কেবল আউটপুট লাইন প্রিন্ট করে তবে শিরোনামের লাইনটি নয়।
dotancohen

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


ধন্যবাদ, এটি জানতে পেরে ভাল লাগল। তবে এটি অন্যদের মধ্যে পাইথন থেকে শুরু হওয়া স্ক্রিপ্টগুলি খুঁজে পাবে না।
dotancohen

4

পরীক্ষার জন্য প্রথমে আপনার .bashrc ফাইলে নিম্নলিখিতটি রাখুন বা শেলটিতে অনুলিপি / কপি করুন

function psls { 
ps aux|head -1 && ps aux|grep "$1"|grep -v 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

এমনকি শেল কমান্ড লাইনে ফাংশনটি স্বয়ংক্রিয়ভাবে পূর্ণ হবে। আপনি অন্য উত্তরে যেমনটি বলেছেন, আপনি একটি কলকে PS এ সংরক্ষণ করতে কোনও ফাইলের প্রথম লাইনটি পাইপ করতে পারেন।


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

ধন্যবাদ, এই উত্তরগুলির মধ্যে কয়েকটি এই প্রশ্নের সাধারণ ক্ষেত্রে আলোচনা করে। পারফেক্ট!
dotancohen

3

কমপিউনিক্স.শেল-এ জ্যানিস পাপনাগনৌকে বেশিরভাগ ধন্যবাদ, আমি নিম্নলিখিত ফাংশনটি ব্যবহার করছি:

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

এর অনেকগুলি সুবিধা রয়েছে:

  • বাশ, zsh এবং সম্ভবত ksh এর সাথে কাজ করে
  • এটি গ্রেপের জন্য একটি ড্রপ-ইন প্রতিস্থাপন, যাতে আপনি যে কোনও পতাকা ব্যবহার করতে চালিয়ে যেতে পারেন: -iকেস-সংবেদনশীল মিলের জন্য,-E গ্রেপের জন্য জন্য, প্রসারিত রেজিক্সগুলির জন্য ইত্যাদি etc.
  • আপনি প্রোগ্রামক্রমে কোনও লাইন আসলে মেলে কিনা তা নির্ধারণ করতে চান ক্ষেত্রে সর্বদা গ্রেপ হিসাবে একই প্রস্থান কোডটি পাওয়া যায়
  • ইনপুট ফাঁকা থাকলে কিছুই প্রিন্ট করে না

ব্যবহারের উদাহরণ:

$ 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করার rআউটপুট EAD ps auxবাফারের মধ্যে এবং তারপর অ মেলে এমন সমস্ত লাইন মুছে ফেলতে 2,$পরিসীমা এবং ফলাফলের মুদ্রণ:

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

যদি এটি শুধুমাত্র পূর্ণ শিরোনামগুলির সাথে গ্রেপিং প্রক্রিয়াগুলির জন্য হয় তবে আমি @ এমআরবির পরামর্শটি প্রসারিত করব:

$ 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
ধন্যবাদ. ওপি অনুসারে, আমি লাইনের কিছু পাঠ্য জানি, তবে রেখার সংখ্যাটি নয়।
ডটানকোচেন

ওপির সাথে ঘনিষ্ঠভাবে সম্পর্কিত এই ব্যবহারের ক্ষেত্রে সন্ধান করার সময় এটি গুগলে একটি উত্তর হিসাবে পপ আপ হয়, সুতরাং এখানে লক্ষণীয়।
ডেজলফ

1
যদি এটি হয় তবে আমি আপনাকে পরামর্শ দিচ্ছি যে আপনি একটি নতুন প্রশ্ন শুরু করুন এবং এই উত্তরটি দিয়ে উত্তর দিন। SE তে আপনার নিজের প্রশ্নের উত্তর দেওয়া পুরোপুরি ঠিক আছে, বিশেষত আপনি যে পরিস্থিতিতে উল্লেখ করেছেন in এগিয়ে যান এবং ওপিতে একটি মন্তব্যে আপনার নতুন প্রশ্নের সাথে লিঙ্ক করুন।
দোটানকোহেন

এই জাতীয় প্রশ্ন রয়েছে, তবে তারা বর্তমানে গুগলে পপ আপ করে না।
ডায়েজল্ফ

ডেজল্ফ, নীচের লাইনটি হল - আপনার উত্তরটি এখানে প্রশ্নের উত্তর দেয় না । @ ডটানকোহেন ঠিক বলেছেন - ওপির সাথে ঘনিষ্ঠভাবে সম্পর্কিত এই ব্যবহারের ক্ষেত্রে সন্ধানের সময় যদি গুগলে এই উত্তরটি উঠে আসে তবে একটি পৃথক প্রশ্ন জিজ্ঞাসা করুন - সেই ঘনিষ্ঠভাবে সম্পর্কিত ব্যবহারের ক্ষেত্রে বিশদ বিবরণ - এবং এর উত্তর দিন।
don_crissti
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.