একটি লগ ফাইল পুচ্ছ কিন্তু শুধুমাত্র নির্দিষ্ট লাইন প্রদর্শন


29

আমি -f পতাকা সহ একটি লগ ফাইল টেল করছি। তারপরে আমি এটিকে গ্রেপ-এ পাইপ করছি, কেবলমাত্র "এক্স" ধারণকারী লাইনগুলি খুঁজে পেতে। এটা পুরোপুরি ঠিক আছে। এখন আমি এটি আবার একটি গ্রেপ-তে পাইপ করতে চাই, যা "Y" যুক্ত সমস্ত লাইন সরিয়ে ফেলবে। আমি যখন দ্বিতীয় পাইপ যুক্ত করব তখন ফাইলটি সতেজ হওয়া বন্ধ করে দেয় এবং দেখে মনে হয় কোনও ডাটা আসছে না।

এই আদেশটি কাজ করে: tail -f my_file.log | grep "X"

এটি হ'ল আদেশ নয়: tail -f my_file.log | grep "X" | grep -v "Y"

কমান্ডটি কাজ করে যাতে আমি এটি কীভাবে গঠন করব?


1
এক পাইপ দিয়ে একটি পাইপ করার চেষ্টা করুন, ক্রম পরিবর্তন করুন, করুন tail -f file|grep -v "Y"। যদি আউটপুট ঠিক থাকে তবে সংযোজন করতে এগিয়ে যান grep "X"
আইজউদ্দিন জালি

উত্তর:


38

আউটপুট হিসাবে grepবাফার হয়, ব্যবহার --line-bufferedকরার বিকল্প grepলাইন বাফারিং সক্ষম করতে:

tail -f /path/to/log | grep --line-buffered 'X' | grep -v 'Y'

আপনার যদি grepবিকল্প না থাকে তবে আপনি বিকল্প stdbufহিসাবে ব্যবহার করতে পারেন :

tail -f /path/to/log | stdbuf -oL grep 'X' | grep -v 'Y'

1
আমি ভাবছি কীভাবে কোন সেটিংস ব্যবহার করতে হবে তা stdbufজানায় libstdbuf.so
কাস্পারড

@ ক্যাস্পার্ড: পরিবেশ পরিবর্তনশীল।
নেট এল্ডারেজ

1
@ নেটএলড্রেডজ আমি ইতিমধ্যে আউটপুটে পরিবেশের পরিবর্তনশীলগুলির সন্ধান করেছি এবং এর মধ্যে diff -u <(env) <(stdbuf env)কোনও কিছুই পাইনি। তবে এখন আমি বুঝতে পারি যে আমার যা পরীক্ষা করা উচিত ছিল তা ছিল diff -u <(env) <(stdbuf -oL env)
ক্যাস্পারড

আমিও একই ধরণের সমস্যা। আমার কেসটি হ'ল, আমাকে সমস্ত লাইনগুলিতে 'আ' এবং 'বিবিবি' প্রিন্ট করতে হবে। উপরে প্রথম সমাধান কাজ করছে না। দ্বিতীয় সমাধান 'আ' বিদ্যমান এবং 'বিবিবি'র অস্তিত্বের জন্য কাজ করছে। উভয়ই কাজ করছে না। কোনও আউটপুট দিচ্ছে না। আমার কমান্ডটি এরকম দেখাচ্ছে: tail -f test.txt | stdbuf -oL grep 'aaa' | grep 'bbb' এটি কোনও আউটপুট দেয় না। দয়া করে আমাকে একটু সাহায্য করবেন.
সূর্য

18

আমি সাধারণত awkএই জাতীয় যৌক্তিক পরীক্ষার জন্য আরও দরকারী বলে মনে করি :

tail -f /path/to/log | awk '/X/ && !/Y/'
#                           ^^^    ^^^^
#                   this I want    but not this

দুটি ট্যাব থাকার মাধ্যমে পরীক্ষিত, একটিতে আমি লিখতে থাকি seq 20 >> myfileএবং অন্যটি উদাহরণস্বরূপ থাকে tail -f myfile | awk '/3/ && !/13/'


15

আর একটি উপায় grepহ'ল দু'টির পরিবর্তে একটি একক অনুরোধ ব্যবহার করা এবং বাফারিংয়ের বিষয়টি এড়ানো উচিত। কেবল একটি নিয়মিত এক্সপ্রেশন ব্যবহার করুন যা 0 বা ততোধিক নন-ওয়াই অক্ষর সমন্বিত লাইনগুলির সাথে মেলে, তারপরে একটি এক্স এবং তারপরে 0 বা আরও নন-ওয়াই আবার লাইনের শেষ অবধি "

tail -f /path/to/log | grep '^[^Y]*X[^Y]*$'
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.