কারণ কেন
tac file | grep foo | head -n 1
প্রথম ম্যাচে থামছে না বাফারিংয়ের কারণে।
সাধারণত, head -n 1একটি লাইন পড়ার পরে প্রস্থান করে। সুতরাং grepএটির দ্বিতীয় লাইনটি লেখার সাথে সাথে একটি সিগপাইপ পাওয়া এবং প্রস্থান করা উচিত।
তবে যা হয় তা হ'ল কারণ এর আউটপুট কোনও টার্মিনালে যাচ্ছে না, grepএটি বাফার করে। এটি, এটি যথেষ্ট পরিমাণে জমে না হওয়া পর্যন্ত এটি লিখছে না (জিএনইউ গ্রেপ সহ আমার পরীক্ষায় 4096 বাইট)।
এর অর্থ কী grepএটি 8192 বাইট ডেটা লিখে দেওয়ার আগে প্রস্থান করবে না, সম্ভবত বেশ কয়েকটি লাইন।
জিএনইউ দিয়ে grepআপনি এটি ব্যবহার করে তাড়াতাড়ি প্রস্থান --line-bufferedকরতে পারবেন যা টার্মিনালে যায় কিনা তা নির্বিশেষে পাওয়া যায় তবেই এটি লাইন লিখতে বলে lines সুতরাং grepএটি খুঁজে দ্বিতীয় লাইনে প্রস্থান করবে।
তবে জিএনইউর সাথে grepযাইহোক, আপনি এর -m 1পরিবর্তে @ টেরডন দেখিয়ে ব্যবহার করতে পারেন , এটি প্রথম ম্যাচে প্রস্থান হওয়ার সাথে সাথে আরও ভাল।
যদি আপনার grepজিএনইউ না হয় grepতবে আপনি তার পরিবর্তে sedবা ব্যবহার করতে পারেন awk। তবে tac জিএনইউ কমান্ড হওয়ার কারণে আমি সন্দেহ করি যে আপনি এমন একটি সিস্টেম পাবেন tacযেখানে grepজিএনইউ নেই grep।
tac file | sed "/$pattern/!d;q" # BRE
tac file | P=$pattern awk '$0 ~ ENVIRON["P"] {print; exit}' # ERE
কিছু সিস্টেমকে tail -rজিএনইউর মতো কাজ করতে tacহয়।
দ্রষ্টব্য, নিয়মিত (সন্ধানযোগ্য) ফাইলগুলির জন্য tacএবং tail -rদক্ষ কারণ তারা ফাইলগুলি পিছিয়ে পড়ে, তারা কেবল ফাইলটিকে পিছনে ছাপানোর আগে মেমরিতে পুরোপুরি পড়ছে না ( @ স্ল্যামের সিড পদ্ধতির হিসাবে বা tacনিয়মিত নয় এমন ফাইলগুলিতে) ।
যেসব সিস্টেমে tacনাও tail -rউপলভ্য নয়, কেবলমাত্র বিকল্পগুলি হ'ল ব্যাকগ্রাউন্ড-রিডিংটি প্রোগ্রামিং ভাষা perlবা ব্যবহারের মতো ভাষা দিয়ে হাতে প্রয়োগ করা হবে:
grep -e "$pattern" file | tail -n1
বা:
sed "/$pattern/h;$!d;g" file
তবে এর অর্থ সমস্ত ম্যাচ সন্ধান করা এবং কেবল শেষটি মুদ্রণ করা।