linux - কিভাবে 'grep' একটি ধারাবাহিক প্রবাহ?




bash shell (8)

BSD grep (FreeBSD, Mac OS X ইত্যাদি) ব্যবহার করার সময় grep এর লাইন বাফারিং মোড চালু করুন।

tail -f file | grep --line-buffered my_pattern

আপনি এটি GNU grep (বেশিরভাগ কোনও লিনাক্সে ব্যবহৃত হয়) এর জন্য এটি করতে হবে না কারণ এটি ডিফল্টরূপে ফ্লাশ করবে (অন্যান্য ইউনিক্স-লেক্স যেমন SmartOS, AIX বা QNX এর জন্য YMMV)।

একটি ধারাবাহিক প্রবাহ উপর grep ব্যবহার করা সম্ভব?

আমার মানে কি একটি tail -f <file> কমান্ডের ধরন, কিন্তু আউটপুট উপর grep সঙ্গে শুধুমাত্র যে লাইন আমাকে আগ্রহ রাখতে রাখা।

আমি tail -f <file> | grep pattern চেষ্টা করেছি। tail -f <file> | grep pattern tail -f <file> | grep pattern কিন্তু মনে হয় যে grep শুধুমাত্র tail শেষ একবার মৃত্যুদন্ড কার্যকর করা যেতে পারে, যে কখনও বলতে হয়।


Grep এর পরিবর্তে awk (অন্য দুর্দান্ত ব্যাশ ইউটিলিটি) ব্যবহার করুন যেখানে আপনার লাইন buffered বিকল্প নেই! এটি ধারাবাহিকভাবে tail থেকে আপনার তথ্য প্রবাহিত হবে।

এই আপনি grep ব্যবহার করে কিভাবে

tail -f <file> | grep pattern

আপনি কিভাবে awk ব্যবহার করবে

tail -f <file> | awk '/pattern/{print $0}'

আপনি যদি সম্পূর্ণ ফাইলে মিল খুঁজে পেতে চান (শুধুমাত্র লেজ নয়), এবং আপনি এটি বসতে এবং কোনও নতুন মিলের জন্য অপেক্ষা করতে চান তবে এটি চমত্কারভাবে কাজ করে:

tail -c +0 -f <file> | grep --line-buffered <pattern>

-c +0 পতাকা বলে যে আউটপুটটি ফাইলের শুরুতে ( + ) থেকে 0 বাইট ( -c ) শুরু করা উচিত।


আমি tail -f <file> | grep <pattern> ব্যবহার করি tail -f <file> | grep <pattern> tail -f <file> | grep <pattern> সব সময়।

এটি grep flushes পর্যন্ত অপেক্ষা করবে, এটি শেষ না হওয়া পর্যন্ত (আমি উবুন্টু ব্যবহার করছি)।


এই এক কমান্ড আমার জন্য কাজ করে (Suse):

mail-srv:/var/log # tail -f /var/log/mail.info |grep --line-buffered LOGIN  >> logins_to_mail

মেইল সেবা লগইন সংগ্রহ


বেশিরভাগ ক্ষেত্রে, আপনি tail -f /var/log/some.log |grep foo করতে পারেন এবং এটি ঠিক সূক্ষ্ম কাজ করবে।

যদি চলমান লগ ফাইলে একাধিক greps ব্যবহার করতে হয় এবং আপনি কোনও আউটপুট পান না তবে আপনাকে আপনার মধ্যবর্তী grep (গুলি) -এ --line-buffered সুইচটি --line-buffered , যেমন:

tail -f /var/log/some.log | grep --line-buffered foo | grep bar

হ্যাঁ, এই আসলে ঠিক সূক্ষ্ম কাজ করবে। Grep এবং বেশিরভাগ ইউনিক্স কমান্ডগুলি এক সময়ে এক লাইনের প্রবাহে কাজ করে। লেজ থেকে বেরিয়ে আসা প্রতিটি লাইন বিশ্লেষণ করা হবে এবং যদি এটি মিলিত হয়।


sed একটি ভাল পছন্দ হবে ( প্রবাহ সম্পাদক)

tail -n0 -f <file> | sed -n '/search string/p'

এবং যদি আপনি একটি নির্দিষ্ট স্ট্রিং পাওয়ার পরে লেজ কমান্ডটি প্রস্থান করতে চান তবে:

tail --pid=$(($BASHPID+1)) -n0 -f <file> | sed -n '/search string/{p; q}'

স্পষ্টত একটি bashism: $ BASHPID লেজ কমান্ডের প্রক্রিয়া আইডি হবে। Sed কমান্ড পাইপের লেয়ারের পরে পরবর্তী, তাই sed প্রসেস আইডি $ BASHPID + 1 হবে।





tail