ধারাবাহিক ধারাটি কীভাবে 'গ্রেপ' করবেন?


729

grepএকটি অবিচ্ছিন্ন স্ট্রিম ব্যবহার করা কি সম্ভব ?

আমি যা বোঝাতে চাইছি তা হ'ল একটি tail -f <file>কমান্ড, তবে grepআউটপুটটি যাতে আমার আগ্রহী কেবল সেই রেখাগুলি রাখে।

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


9
সম্ভবত ফাইলটি উত্পন্ন করার প্রোগ্রামটি এর আউটপুট ফ্লাশ করছে না highly
স্টিভ-ও

tail -f fileকাজ করে (আমি রিয়েল টাইমে নতুন আউটপুটটি দেখতে পাচ্ছি)
ম্যাথিউ নাপোলি

6
যথাযথ হবে unix.stackexchange.com
লুক এম

@ লুক প্রকৃতপক্ষে, সে সম্পর্কে ভাবেননি
ম্যাথিউ নাপোলি

আপনার ইনপুট স্ট্রিমে কোনও নতুন লাইন নেই? যদি তাই হয় গ্রেপ এগিয়ে না।
লঞ্চ

উত্তর:


1326

grepবিএসডি গ্রেপ (ফ্রিবিএসডি, ম্যাক ওএস এক্স ইত্যাদি) ব্যবহার করার সময় লাইন লাইন বাফারিং মোডটি চালু করুন

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

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


3
@ মিশেলনিমেড আপনি লেজ -F ফাইল ব্যবহার করতে পারেন | গ্রেপ - লাইন-বাফার্ড মাই_প্যাটার্ন
জেসিফ্রেই

47
পছন্দ করুন লোকেরা এটিকে উজ্জীবিত করে কারণ তারা যখন "গ্রেপ লাইন বাফার" গুগল করে তারা এই পৃষ্ঠাটি আবিষ্কার করে এবং এটি তাদের জন্য একটি সমস্যা সমাধান করে যা সম্ভবত প্রশ্ন হিসাবে উত্থাপিত হতে পারে না।
বৃষ্টি

4
আমি এখানে আউটপুট গ্রেপ করার চেষ্টা করে এসেছি strace। ছাড়া --line-buffered, এটি কাজ করবে না।
sjas

5
@ মাইকেল গল্ডশটেন (এবং তার মন্তব্যের প্রবর্তক): আমার সবসময় এই সমস্যাটি ছিল tail -f | grepএবং --line-bufferedএটি আমার জন্য সমাধান করে (উবুন্টু ১৪.০৪, জিএনইউ গ্রেপ সংস্করণ ২.১16)। "স্টডআউট যদি টিটিটি হয় তবে" লাইন ব্যাফারিংটি কোথায় প্রয়োগ করা হবে? ইন git.savannah.gnu.org/cgit/grep.git/tree/src/grep.c , line_bufferedশুধুমাত্র যুক্তি পার্সার দ্বারা সেট করা হয়।
আসমুন্ড এলদুয়েস্ট

8
@ মিশেলগোল্ডশটেন আমি বিএসডি গ্রেপ ব্যবহার করে ম্যাকোজে আছি এবং --line-bufferedআমার আউটপুট না পেয়ে। যাইহোক, পরীক্ষার পরে, দেখে মনে হচ্ছে GNU গ্রেপ আপনার বর্ণনা অনুযায়ী যা করে। তাই ইউনিক্সের বেশিরভাগ জিনিসের মতো এটি আপনার প্ল্যাটফর্মের প্রয়োগের উপর নির্ভর করে। যেহেতু প্রশ্ন প্ল্যাটফর্ম নির্দিষ্ট করে না, আপনার তথ্যটি মিথ্যা বলে মনে হয় - বিএসডি গ্রেপের কোডটি পর্যালোচনা করে এবং এটি জিএনইউ গ্রেপের সাথে তুলনা করার পরে, আচরণটি অবশ্যই লাইন-বাফার বিকল্প দ্বারা নিয়ন্ত্রিত হয়। এটি কেবলমাত্র জিএনইউ গ্রেপ ডিফল্টরূপে ফ্লাশ করে।
রিচার্ড ওয়েট

118

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

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


4
যা বেশ কিছুক্ষণ স্থায়ী হতে পারে তাই অধৈর্য না হওয়ার চেষ্টা করুন।
glglgl

এটি প্রায় কতক্ষণ নিতে পারে?
ম্যাথিউ নাপোলি

@ ম্যাথিউঃ: মূলত আপনি কী জন্য গ্রেপ করেন এবং আপনার ওএসে বাফারগুলি কতটা বড় তা নির্ভর করে। যদি গ্রেপ প্রতি কয়েক ঘন্টা কেবল একটি সংক্ষিপ্ত স্ট্রিংয়ের সাথে মেলে তবে এটি প্রথম ফ্লাশের কয়েক দিন আগেই হবে।
ট্রিপলি

13
লেজ আউটপুট বাফারিং ব্যবহার করে না - গ্রেপ করে।
XzKto

7
না, গ্রেট আউটপুট বাফারিং করে না যখন আউটপুট টিটিটি ডিভাইসে যায়, কারণ এটি পরিষ্কারভাবে এই উত্তরে রয়েছে। এটা লাইন বাফারিং না! এটি সঠিক উত্তর এবং গ্রহণযোগ্য উত্তর হওয়া উচিত। আরও তথ্যের জন্য বর্তমানে গৃহীত ( ভুল ) উত্তরে আমার দীর্ঘ মন্তব্য দেখুন ।
মাইকেল গোল্ডস্টেইন

67

আমি মনে করি আপনার সমস্যাটি হ'ল গ্রেপ কিছু আউটপুট বাফারিং ব্যবহার করে। চেষ্টা

tail -f file | stdbuf -o0 grep my_pattern

এটি গ্রেফের আউটপুট বাফারিং মোডটিকে আনবুফার্ডে সেট করবে।


7
এবং এর সুবিধা রয়েছে যে এটি ছাড়াও আরও অনেক কমান্ডের জন্য ব্যবহার করা যেতে পারে grep
পিটার ভি। মার্চ

4
যাইহোক, আমি এটির সাথে আরও খোলার পরে আবিষ্কার করেছি, কিছু টি কমান্ড কেবলমাত্র টিটিটির সাথে যুক্ত হওয়ার পরে কেবলমাত্র তার আউটপুটটি ফ্লাশ করে দেয় এবং তার জন্য unbuffer( expect-devডিবিয়ান প্যাকেজের মধ্যে ) রাজা । সুতরাং আমি stdbuf উপর আনফার ব্যবহার করব।
পিটার ভি। মার্চ

5
@ পিটার ভি। মার্চ হ্যাঁ, আপনি ঠিকই বলেছেন, স্টাফবুফ না পারে এমন জায়গায় কখনও কখনও কাজ করা যায় না b তবে আমি মনে করি আপনি একটি 'যাদু' প্রোগ্রামার সন্ধানের চেষ্টা করছেন যা আপনার সমস্যা বোঝার পরিবর্তে সর্বদা আপনার সমস্যাগুলি সমাধান করবে। ভার্চুয়াল টিটি তৈরি করা সম্পর্কযুক্ত কাজ। স্টাডবুফ আমরা যা চাই ঠিক তা করে (মান দেওয়ার জন্য স্ট্যান্ডার্ড আউটপুট বাফার সেট করে), অন্যদিকে আনফার প্রচুর গোপন স্টাফ করে যা আমরা চাই না ( topস্টেডবুফ এবং আনফফারের সাথে ইন্টারেক্টিভের তুলনা করুন )। এবং সত্যিই কোনও 'ম্যাজিক' সমাধান নেই: আনবুফার কখনও কখনও ব্যর্থ হয়, উদাহরণস্বরূপ awk বিভিন্ন বাফার বাস্তবায়ন ব্যবহার করে (stdbuf খুব ব্যর্থ হবে)।
XzKto

2
"তবে আমি মনে করি আপনি একটি 'যাদু' প্রোগ্রামার সন্ধান করার চেষ্টা করছেন যা আপনার সমস্যা বোঝার পরিবর্তে সর্বদা আপনার সমস্যাগুলি সমাধান করবে" " - আমি মনে করি আপনি ঠিক! ;-)
পিটার ভি। মার্চ

1
stdbufPixelbeat.org/programming/stdio_buffering- এ আরও কিছু তথ্য , `আনফার, এবং স্টিডিও
টোর ক্লিংবার্গ

13

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

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

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


12

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

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

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

7

আপনি এই উত্তরটিকে বর্ধন হিসাবে বিবেচনা করতে পারেন .. সাধারণত আমি ব্যবহার করছি

tail -F <fileName> | grep --line-buffered  <pattern> -A 3 -B 5

-ফাইলে ফাইল ঘোরানোর ক্ষেত্রে আরও ভাল (-ফ ফাইলটি ঘোরালে সঠিকভাবে কাজ করবে না)

-A এবং -B প্যাটার্ন উপস্থিতির ঠিক আগে এবং পরে লাইনগুলি পেতে দরকারী .. এই ব্লকগুলি ড্যাশযুক্ত লাইন বিভাজকের মধ্যে উপস্থিত হবে

তবে আমার জন্য আমি নিম্নলিখিতগুলি করা পছন্দ করি

tail -F <file> | less

আপনি যদি স্ট্রিমযুক্ত লগের ভিতরে সন্ধান করতে চান তবে এটি খুব কার্যকর। মানে পিছনে পিছনে যাও এবং গভীরভাবে তাকান


4
grep -C 3 <pattern>, -এ <এন> এবং -বি <এন> এর পরিবর্তে এন একই হয়।
একেএস

6

কেউ এর জন্য আমার সাধারণ যেতে যেতে দেখেনি:

less +F <file>
ctrl + c
/<search term>
<enter>
shift + f

আমি এটি পছন্দ করি, কারণ আপনি ctrl + cযখনই ফাইলটি থামাতে এবং নেভিগেট করতে ব্যবহার করতে পারেন , এবং তারপরে shift + fসরাসরি, লাইভ স্ট্রিমিং অনুসন্ধানে ফিরে আসতে পারেন।


4

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

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

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

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

অবশ্যই বাশিজম: $ বাশপিআইডি হ'ল লেজ কমান্ডের প্রক্রিয়া আইডি। পাইপটিতে লেজের পরে সেড কমান্ডটি পরবর্তী, সুতরাং সেড প্রক্রিয়া আইডি হবে $ BASHPID + 1।


1
সিস্টেমে ( $BASHPID+1) আপনার পরবর্তী প্রক্রিয়াটি শুরু হবে এই ধারণাটি অনেক পরিস্থিতিতে মিথ্যা, এবং এটি বাফারিং সমস্যা সমাধানের জন্য কিছুই করে না যা সম্ভবত ওপিই জিজ্ঞাসা করার চেষ্টা করেছিল। বিশেষত, এখানে সুপারিশ sedকরা grepনিছক (সন্দেহজনক) পছন্দের বিষয় বলে মনে হচ্ছে। (আপনি যদি সেই পয়েন্টটিই সরবরাহ করার চেষ্টা করছেন তবে আপনি তার p;qসাথে আচরণ করতে grep -m 1পারেন
ট্রিপলি

কাজ করে, সেড কমান্ড প্রস্তুত হওয়ার সাথে সাথে প্রতিটি লাইন মুদ্রণ করে, গ্রেপ কমান্ডটি --line-bufferedকরেনি। আমি আন্তরিকভাবে বিয়োগ 1 টি বুঝতে পারি না
মিউইই বেলজিয়াম

এটা তোলে ইত: পূর্বে স্থাপন করা হয় যে বাফার উপলব্ধ সঙ্গে সমস্যা , grep । কোন বিশেষ ক্রিয়াটিকে চালনা লাইন বাফার উপলব্ধ ব্যবহার করার প্রয়োজন বোধ করা হয় sed , এটা ডিফল্ট আচরণ অত: পর আমার শব্দের জোর হয়, প্রবাহ । আর সত্য, সেখানে নেই গ্যারান্টি $ BASHPID +1 সঠিক হতে হবে PID উপভোগ করতে চান, কিন্তু যেহেতু PID বরাদ্দ অনুক্রমিক হয় এবং পাইপ লাইনের কমান্ড একটি নির্ধারিত হয় PID অবিলম্বে নিম্নলিখিত, এটা একদম সম্ভাব্য হয়।
ক্রিশ্চিয়ান হের

1

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


2
এটি আসলে সঠিক নয়। যদি grepপাইপ চেইনের সর্বশেষ আদেশ হয় তবে এটি আপনার ব্যাখ্যা অনুসারে কাজ করবে। তবে, এটি যদি মাঝখানে থাকে তবে এটি একবারে 8 কে আউটপুট বাফার করবে।
মাহমুদ আল-কুদসি

1

এই ওয়ান কমান্ডটি আমার জন্য কাজ করে (সুস):

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

মেল পরিষেবাতে লগইন সংগ্রহ করা


-1

আপনি অবশ্যই সফল হবে না

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

আপনি যখন লেজের জন্য একটি উপন্যাস হিসাবে "কলরটেল" ব্যবহার করেন, যেমন। ব্যাশে

alias tail='colortail -n 30'

যদি এটি লেজ ইসান ওরফে এর মতো কোনও ফলাফল দেয় তবে আপনি প্রকারের নাম দিয়ে পরীক্ষা করতে পারেন colortail -n 30। তাহলে আপনার অপরাধী আছে :)

সমাধান:

সঙ্গে উপনাম মুছে ফেলুন

unalias tail

নিশ্চিত হয়ে নিন যে আপনি এই কমান্ড দ্বারা 'রিয়েল' লেজ বাইনারি ব্যবহার করছেন

type tail

যা এমন কিছু আউটপুট করা উচিত:

tail is /usr/bin/tail

এবং তারপরে আপনি আপনার কমান্ড চালাতে পারেন

tail -f foo.log |grep --line-buffered something

শুভকামনা।


-4

গ্রেপের পরিবর্তে awk (অন্য দুর্দান্ত বাশ ইউটিলিটি) ব্যবহার করুন যেখানে আপনার লাইন বাফার বিকল্প নেই! এটি অবিচ্ছিন্নভাবে আপনার ডেটা লেজ থেকে প্রবাহিত করবে।

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

tail -f <file> | grep pattern

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

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

6
এটি সঠিক নয়; বাক্সের বাইরে থাকা বেশিরভাগ স্ট্যান্ডার্ড ইউনিক্স সরঞ্জামগুলির মতো লাইন বাফারিংও করে। (তদুপরি, এটি {print $0}অপ্রয়োজনীয়, কারণ কোনও শর্ত পেরিয়ে গেলে মুদ্রণ হ'ল ডিফল্ট ক্রিয়া))
ট্রিপলি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.