ভাল পথ
সাধারণত আপনি গ্রেপ দিয়ে এটি করতে পারবেন না তবে আপনি অন্যান্য সরঞ্জাম ব্যবহার করতে পারেন। এডাব্লু কে ইতিমধ্যে উল্লেখ করা হয়েছিল তবে আপনি এটি ব্যবহার করতে পারেন sed
:
sed -e '1p' -e '/youpattern/!d'
কিভাবে এটা কাজ করে:
সেড ইউটিলিটি প্রতিটি লাইনে স্বতন্ত্রভাবে কাজ করে, তাদের প্রতিটিটিতে নির্দিষ্ট কমান্ড চালায় running বিভিন্ন -e
বিকল্প নির্দিষ্ট করে আপনার একাধিক কমান্ড থাকতে পারে । আমরা প্রতিটি কমান্ডকে একটি পরিসীমা প্যারামিটার দিয়ে প্রেন্ডেন্ড করতে পারি যা নির্দিষ্ট করে রেখায় এই আদেশটি প্রয়োগ করা উচিত কিনা তা নির্দিষ্ট করে।
"1 পি" প্রথম কমান্ড command এটি p
কমান্ড ব্যবহার করে যা সাধারণত সমস্ত লাইন মুদ্রণ করে। তবে আমরা এটিকে এমন একটি সংখ্যাসূচক মান দিয়ে প্রেন্ডেন্ড করি যা এটি প্রয়োগ করতে হবে তার সীমাটি নির্দিষ্ট করে। এখানে, আমরা 1
প্রথম লাইন যার অর্থ ব্যবহার করি । আপনি যদি আরও লাইন মুদ্রণ করতে চান তবে আপনি x,yp
যেখানে x
মুদ্রণের জন্য প্রথম লাইনটি ব্যবহার করতে পারেন , y
এটি মুদ্রণের শেষ লাইন। উদাহরণস্বরূপ প্রথম 3 লাইন মুদ্রণ করার জন্য, আপনি ব্যবহার করবেন1,3p
নেক্সট কমান্ড হ'ল d
যা সাধারণত বাফার থেকে সমস্ত লাইন মুছে দেয়। এই কমান্ডের আগে আমরা yourpattern
দুটি /
অক্ষরের মধ্যে রেখেছি। p
কমান্ডটি সঞ্চালিত হওয়া উচিত বলে সম্বোধন করার জন্য এটি অন্যভাবে (প্রথমটি হ'ল আমরা কমান্ডটি দিয়ে কোন লাইনগুলি নির্দিষ্ট করেছি ) addressing এর অর্থ হ'ল কমান্ডটি কেবল মিলিত লাইনের জন্য কাজ করবে yourpattern
। বাদে আমরা কমান্ডের !
আগে অক্ষর ব্যবহার করি d
যা এর যুক্তিটিকে উল্টে দেয়। সুতরাং এখন এটি সমস্ত রেখাগুলি সরিয়ে ফেলবে যা নির্দিষ্ট প্যাটার্নের সাথে মেলে না ।
শেষে, সেফ বাফারে থাকা সমস্ত লাইন মুদ্রণ করবে। তবে আমরা লাইনগুলি সরিয়ে দিয়েছি যা বাফারের সাথে মেলে না তাই কেবল মিলিত লাইনগুলি মুদ্রণ করা হবে।
সংক্ষিপ্তসার হিসাবে: আমরা 1 ম লাইনটি মুদ্রণ করি, তারপরে আমরা সমস্ত লাইন মুছে ফেলি যা ইনপুট থেকে আমাদের প্যাটার্নের সাথে মেলে না। লাইনের বিশ্রাম (তাই শুধুমাত্র লাইন যে ছাপা হয় না প্যাটার্ন মেলে)।
প্রথম লাইনের সমস্যা
মন্তব্যে উল্লিখিত হিসাবে, এই পদ্ধতির সাথে একটি সমস্যা আছে। যদি নির্দিষ্ট প্যাটার্নটি প্রথম লাইনের সাথেও মেলে তবে এটি দু'বার মুদ্রিত হবে (একবার p
আদেশ দ্বারা এবং একবার ম্যাচের কারণে)। আমরা এটিকে দুটি উপায়ে এড়াতে পারি:
যোগ করার পদ্ধতি 1d
পরে কমান্ড 1p
। আমি ইতিমধ্যে উল্লিখিত হিসাবে, d
কমান্ড বাফার থেকে লাইনগুলি মুছে ফেলে এবং আমরা এর সংখ্যা 1 দ্বারা বিস্তৃত করব, যার অর্থ এটি কেবল 1 ম লাইনটি মুছবে। সুতরাং আদেশ হবেsed -e '1p' -e '1d' -e '/youpattern/!d'
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'
কিভাবে এটা কাজ করে
প্রথমে আমরা -n
প্রতিটি লাইনের আগে লাইন নম্বর যুক্ত করতে বিকল্পটি ব্যবহার করি । আমরা যে সমস্ত লাইনের সাথে আমরা মেলেছি তার সমস্ত কিছু অঙ্ক করতে চাই .*
- কিছু এমনকি খালি লাইনও। মন্তব্যে যেমন পরামর্শ দেওয়া হয়েছে, আমরা '^' এর সাথেও মেলাতে পারি, ফলাফল একই।
তারপরে আমরা প্রসারিত নিয়মিত এক্সপ্রেশন ব্যবহার করছি যাতে আমরা \|
বিশেষ চরিত্রটি ব্যবহার করতে পারি যা ওআর হিসাবে কাজ করে। সুতরাং লাইনটি 1:
(প্রথম লাইন) দিয়ে শুরু হলে বা আমাদের প্যাটার্ন (এই ক্ষেত্রে এটির syslog
) অন্তর্ভুক্ত থাকলে আমরা মেলে ।
লাইন নম্বর সমস্যা
এখন সমস্যাটি হচ্ছে, আমরা আমাদের আউটপুটে এই কুৎসিত লাইন নম্বর পাচ্ছি। যদি এটি কোনও সমস্যা হয় তবে আমরা এগুলি এগুলি দিয়ে সরাতে পারি cut
:
ps aux | grep -n '.*' | grep -e '\(^1:\)\|syslog' | cut -d ':' -f2-
-d
বিকল্পটি ডিলিমিটার -f
নির্দিষ্ট করে, ক্ষেত্রগুলি (বা কলাম) নির্দিষ্ট করে যা আমরা মুদ্রণ করতে চাই। সুতরাং আমরা প্রতিটি :
চরিত্রের প্রতিটি লাইন কাটতে চাই এবং কেবল ২ য় এবং পরবর্তী সমস্ত কলাম মুদ্রণ করতে চাই। এটি কার্যকরভাবে ডিলিমিটার সহ প্রথম কলামটি সরিয়ে দেয় এবং এটি আমাদের প্রয়োজন ঠিক।
ack
তাই দরকারী এবং কেনperl
রকেটের গতsed
,awk
ইত্যাদি জনপ্রিয়তা: এটা অংশের একটি সুসঙ্গত সমগ্র মধ্যে যোগফল করার জন্য গুরুত্বপূর্ণ।