কোনও নির্দিষ্ট স্ট্রিং পর্যবেক্ষণ করা হয় এবং তারপরে প্রস্থান না হওয়া অবধি কমান্ডের আউটপুট "দেখুন"


29

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

কিছুটা এইরকম:

ওয়াচ -এন 1 মাই_সিএমডি | গ্রেপ-এম 1 "স্ট্রিং আমি খুঁজছি"

(তবে এটি আমার পক্ষে কাজ করে না))

আপডেট: আমাকে পরিষ্কার করতে হবে যে 'মাই_সিএমডি' ধারাবাহিকভাবে আউটপুট পাঠ করে না তবে স্ট্রিংটি না পাওয়া পর্যন্ত বার বার কল করা প্রয়োজন (এজন্য আমি 'ওয়াচ' কমান্ডটি ভেবেছিলাম)। এই ক্ষেত্রে, 'মাই_সিমিডি' অন্যান্য ইউনিক্স কমান্ডের মতো যেমন: পিএস, এলএস, এলএসফ, শেষ ইত্যাদি '


আমি ভাবতাম যে tail -fকোনও প্রোগ্রামের ফলাফলের পাশাপাশি একটি ফাইলের পক্ষে এটি সম্ভব হয়েছিল ... আমি কি ভুল করছি?
জোয়ানিস

@Joanis। আপনি ঠিক বলেছেন, তবে আমার ক্ষেত্রে 'আমার_সিমিডি' ধারাবাহিকভাবে আউটপুট তৈরি করে না এবং বার বার বলা উচিত (বেশিরভাগ কমান্ডের মতো: পিএস,
এলএস

উত্তর:


41

একটি লুপ ব্যবহার করুন:

until my_cmd | grep -m 1 "String Im Looking For"; do : ; done

পরিবর্তে :, আপনি sleep 1সিপিইউ স্বাচ্ছন্দ করতে (বা 0.2) ব্যবহার করতে পারেন ।

গ্রেপ কমান্ডের আউটপুটটিতে স্ট্রিং না পাওয়া পর্যন্ত লুপটি চলবে। -m 1"" একটি ম্যাচ যথেষ্ট "অর্থাত্ গ্রেপ এটি প্রথম ম্যাচটি খুঁজে পাওয়ার পরে অনুসন্ধান বন্ধ করে দেয়।

grep -qপ্রথম ম্যাচটি সন্ধানের পরেও যেটি ছাড়বে তা আপনি ব্যবহার করতে পারেন , তবে ম্যাচিং লাইনটি প্রিন্ট না করেই।


এই আদেশের একটি ব্যাখ্যা প্রশংসা করা হবে।
মার্ক ডব্লিউ

@ মার্ক ডাব্লু: আপডেট হয়েছে।
চোরোবা

অন্য কেউ উল্লেখ করেছেন grep -qযা অন্য একটি বিকল্প। স্ট্রিংটি সন্ধান করার পরে গ্রেপ প্রস্থান করে।
সান

মনে রাখবেন যে এই কমান্ডটি বারবার প্রশ্নে কমান্ডটি চালাবে, যা পছন্দসই বা নাও হতে পারে।
এড্রিয়েন

1
@ এএইচ: এটি "আপডেট" এর অধীনে ওপিতে বর্ণিত হিসাবে এটি আকাঙ্ক্ষিত।
চোরোবা

11
watch -e "! my_cmd | grep -m 1 \"String Im Looking For\""
  • ! কমান্ড পাইপলাইনের প্রস্থান কোড অবহেলা করে
  • grep -m 1 স্ট্রিং পাওয়া গেলে প্রস্থান করে
  • watch -e কোনও ত্রুটি ঘটলে ফিরে আসে

তবে এটি সেই মিলে যাওয়া লাইনটি প্রদর্শন করতে উন্নত করা যেতে পারে, যা এখন পর্যন্ত ফেলে দেওয়া হয়।


বিস্তারিত ব্যাখ্যার জন্য ধন্যবাদ, তবে এটি আমার পক্ষে কার্যকর হয় না। আমার watchকমান্ড (সেন্টোস) এর -eপতাকা নেই (যা সত্যই বিবেচনা করা উচিত নয়)। আরও গুরুত্বপূর্ণ, যদিও স্ট্রিংটি পাওয়া যায়, ঘড়িটি চলতে থাকে এবং প্রস্থান হয় না। মনে হয় যখন বের grep -mহয়, এটি কেবল মেরে যায় my_cmdতবে তা নয় watch
gdw2

না, ব্যাপারটি কী! কমান্ডের একটি ত্রুটি কোড 0 থেকে আলাদা হলে "-e" পতাকাটি ঘড়িটি ছাড়ার জন্য পরামর্শ দেয় কারণ এটি উপস্থিত নেই এমন ঘড়িটি আপনার প্ল্যাটফর্মটিতে চালিয়ে যেতে চলেছে। যাইহোক, জেনে রাখা ভাল, আমার উবুন্টু ১১.১০ এর ইনস্টলেশনতে সবকিছু ঠিক আছে everything আমি খুব মাঝেমধ্যে ম্যাক ওএসএক্সের সাথে খুব খুব পুরানো কমান্ডলাইন সরঞ্জামগুলি সম্পর্কেও সমস্যায় পড়েছি এবং আরও বর্তমান সফ্টওয়্যার পেতে আমি এখন পর্যন্ত ম্যাক পোর্টগুলি ব্যবহার করছি।
গণিত

প্যাটার্নটি পাওয়া গেলে এটি থেমে যায়, তবে এটি না হওয়া পর্যন্ত কোনও আউটপুট প্রদর্শন করে না
চিহ্নিত করুন

আপনি এটির teeজন্য নিয়োগ দিতে পারেন , তবে এটি একটি বিভ্রান্তিকর নতুন লাইনের সূচনা করে, আমি এখনই কীভাবে ছোটাছুটি করব জানি না:watch -n1 -e "! date | tee /dev/tty | grep --color -m 1 \"17\""
গণিত

হ্যাঁ, এটি আমার পক্ষে কার্যকর হয়নি। watchস্ট্রিংটি পাওয়া গেলে কর্তব্যরতভাবে দেখা বন্ধ করে দেয়, তবে আপনি কোনও চাপ না দেওয়া পর্যন্ত এগুলি প্রকৃতপক্ষে প্রস্থান করে না। নিকটবর্তী.
mlissner

8

যাঁদের একটি প্রোগ্রাম রয়েছে যা নিয়মিত স্টডআউটে লিখছে, তাদের আপনাকে কেবল 'একক ম্যাচ' বিকল্পটি গ্রেপ করার জন্য পাইপ করা উচিত। গ্রেপ একবারে মিলে যাওয়ার স্ট্রিংটি খুঁজে পেলে এটি প্রস্থান করবে যা গ্রেপ-তে পাইপ করা প্রক্রিয়ায় স্টাডাউট বন্ধ করে দেয়। এই ইভেন্টটি উচিত স্বাভাবিকভাবেই প্রোগ্রাম অত্যন্ত শৃঙ্খলার থেকে প্রস্থান করার জন্য কারণ তাই যতদিন প্রক্রিয়া আবার লিখেছেন

কী ঘটবে তা হ'ল গ্রেপ বন্ধ হয়ে যাওয়ার পরে যখন ক্লোজড স্টডআউটে লেখার চেষ্টা করবেন তখন প্রক্রিয়াটি একটি সিগপাইপ পাবে। এখানে পিংয়ের সাথে একটি উদাহরণ রয়েছে যা অন্যথায় অনির্দিষ্টকালের জন্য চলবে:

$ ping superuser.com | grep -m 1 "icmp_seq"

এই কমান্ডটি প্রথম সফল 'পং'-এর সাথে মিলবে এবং তারপরে পরের বার pingস্টাডআউটে লেখার চেষ্টা করবে exit


যাহোক,

এটি সর্বদা গ্যারান্টিযুক্ত নয় যে প্রক্রিয়াটি আবার স্টডআউটে লিখবে এবং তাই কোনও সাইনপাইপ উত্থাপিত হতে না পারে (উদাহরণস্বরূপ, লগ ফাইলের টেলিংয়ের সময় এটি ঘটতে পারে)। এই দৃশ্যের জন্য আমি যে সর্বোত্তম সমাধানটি পরিচালনা করতে পেরেছি তা হ'ল একটি ফাইল লেখার সাথে জড়িত; আপনি যদি উন্নতি করতে পারেন বলে মনে করেন তবে মন্তব্য করুন:

$ { tail -f log_file & echo $! > pid; } | { grep -m1 "find_me" && kill -9 $(cat pid) && rm pid; }

এটি ভেঙে:

  1. tail -f log_file & echo $! > pid- কোনও ফাইলকে লেজ দেয়, ব্যাকগ্রাউন্ডে প্রক্রিয়া সংযুক্ত করে এবং পিআইডি ( $!) একটি ফাইলে সংরক্ষণ করে । পরিবর্তে আমি পিআইডি র পরিবর্তে একটি চলকটিতে রফতানি করার চেষ্টা করেছি, তবে মনে হয় এখানে এবং যখন পিআইডি আবার ব্যবহৃত হয় তখন একটি রেসের শর্ত রয়েছে।
  2. { ... ;}- এই কমান্ডগুলি একসাথে গ্রুপ করুন যাতে আমরা বর্তমান প্রসঙ্গটি রাখার সময় আউটপুটটিকে গ্রেপ করতে পাইপ করতে পারি (ভেরিয়েবলগুলি সংরক্ষণ এবং পুনরায় ব্যবহার করার সময় সহায়তা করে তবে সেই অংশটি কাজ করতে সক্ষম হইনি)
  3. | - পাইপ বাম পাশের stdout থেকে ডান পাশের স্টিডিনে
  4. grep -m1 "find_me" - লক্ষ্য স্ট্রিং সন্ধান করুন
  5. && kill -9 $(cat pid)- বল বধ (SIGKILL) tailপ্রক্রিয়া পর grep প্রস্থানের একবার এটি ম্যাচিং স্ট্রিং খুঁজে বের করে
  6. && rm pid - আমরা তৈরি ফাইলটি সরান

0
my_cmd | tail +1f | sed '/String Im Looking For/q'

যদি tailসমর্থন করে না +1fসিনট্যাক্স, চেষ্টা tail -f -n +1। ( -n +1এটি সূচনাতে শুরু করতে বলে; tail -fডিফল্টরূপে আউটপুটের শেষ 10 লাইন দিয়ে শুরু হয়))


প্রশ্নে আমার আপডেট দেখুন।
gdw2

0

আপনার প্রোগ্রামের কলগুলির ফলাফলটি একটি ফাইলে যুক্ত করুন। তারপরে tail -fসেই ফাইলটি। এইভাবে এটি কাজ করা উচিত ... আমি আশা করি।

আপনি যখন সেই প্রোগ্রামটি কল করা পুনরায় চালু করবেন তখন আপনাকে ফাইলটি মুছে ফেলতে হবে বা এতে কিছু জিব্রিশ যুক্ত করতে হবে যাতে আপনি যা খুঁজছিলেন তা এখনই এটি মেলে না।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.