"পদ" জন্য গ্রেপ এবং "অন্য পদ" বাদ


28

আমি একটি গ্রেপ অনুসন্ধান তৈরির চেষ্টা করছি যা একটি শব্দটির সন্ধান করে তবে লাইনগুলি অন্তর্ভুক্ত করে যার দ্বিতীয় শব্দ রয়েছে। আমি একাধিক -e "pattern"বিকল্প ব্যবহার করতে চেয়েছিলাম কিন্তু এটি কার্যকর হয়নি।

আমি চেষ্টা করেছি এমন কমান্ডের একটি উদাহরণ এবং এটি উত্পন্ন ত্রুটি বার্তাটি।

grep -i -E "search term" -ev "exclude term"
grep: exclude term: No such file or directory

এটি আমার কাছে সীম করে যে -vসমস্ত অনুসন্ধানের পদ / নিদর্শনগুলিতে প্রযোজ্য। যেহেতু এটি চলে তবে search termফলাফলের মধ্যে অন্তর্ভুক্ত হয় না ।

grep -i -E "search term" -ve "exclude term"

বাদ দেওয়ার জন্য কি অন্য কোনও বিকল্প আছে, যেমনটি কখনও কখনও আমাদের শব্দের চারপাশে লাইনগুলি গ্রেপ করতে হয় এবং যদি আমরা '|' ব্যবহার করে পরবর্তী ক্রিয়াকলাপে বাদ দিয়ে থাকি , এটি কেবল এই শব্দটিকে সরিয়ে দেয় তবে সেই শব্দের জন্য ব্লকটি সরাবে না
লার্নার

উত্তর:


40

গ্রেপ সহ এবং এক্সপ্রেশনগুলির জন্য আপনার দুটি নিমন্ত্রণ প্রয়োজন:

grep -Ei "search term" | grep -Eiv "exclude term"

আপনি যে পদগুলি অনুসন্ধান করছেন তা যদি নিয়মিত প্রকাশ না হয় তবে স্থির স্ট্রিং মেলিং ( -F) ব্যবহার করুন যা দ্রুততর:

grep -F "search term" | grep -Fv "exclude term"

18

দু'বার গ্রাহককে সংক্ষেপে সংক্ষিপ্ত করে নেওয়া, আমি এটি সম্পাদন করার জন্য কেবলমাত্র একটি উপায় ভাবতে পারি। এটা তোলে জড়িত পার্ল সামঞ্জস্যপূর্ণ রেগুলার এক্সপ্রেশন (PCRE) এবং কিছু বরং হল hacky বর্ণন-অ্যারাউন্ড গবেষকেরা

বার রয়েছে এমন মিলগুলি বাদ দিয়ে ফু- র অনুসন্ধান করতে, আপনি এটি ব্যবহার করতে পারেন:

grep -P '(?=^((?!bar).)*$)foo'

এখানে কিভাবে এটা কাজ করে:

  • (?!bar)কিছু না মিলে যায় বার স্ট্রিং থেকে অক্ষর গ্রাসকারী ছাড়া। তারপরে .একক চরিত্র গ্রাস করে।

  • ^((?!bar).)*উপরেরটিকে স্ট্রিং ( ^) এর শুরু থেকে ( ) এর শেষ পর্যন্ত পুনরাবৃত্তি করে $। এটি যদি barকোনও নির্দিষ্ট সময়ে সম্মুখীন হয় তবে এটি ব্যর্থ হবে , যেহেতু (?!bar)মিলবে না।

  • (?=^((?!bar).)*$) স্ট্রিংয়ের অক্ষর না খেয়ে স্ট্রিং পূর্ববর্তী প্যাটার্নের সাথে মেলে কিনা তা নিশ্চিত করে।

  • fooযথারীতি foo অনুসন্ধান করে ।

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


দুর্দান্ত হ্যাক। এই কৌশলটি জাভাতেও কাজ করে, বিটিডাব্লু।
রমন

12

আপনি যদি একটি পাসে এটি করতে চান তবে আপনি গ্রেপের পরিবর্তে awk ব্যবহার করতে পারেন।

বিন্যাস:

echo "some text" | awk '/pattern to match/ && !/pattern to exclude/'

উদাহরণ:

  • echo "hello there" | awk '/hello/ && !/there/'

কিছুই দেয় না

  • echo "hello thre" | awk '/hello/ && !/there/'

ফেরত: হ্যালো থ্র

  • echo "hllo there" | awk '/hello/ && !/there/'

কিছুই দেয় না

একাধিক নিদর্শনগুলির জন্য, আপনি তাদের গোষ্ঠীভুক্ত করতে প্রথম বন্ধনী ব্যবহার করতে পারেন।

উদাহরণ:

  • echo "hello thre" | awk '(/hello/ || /hi/) && !/there/'

ফেরত: হ্যালো থ্র

  • echo "hi thre" | awk '(/hello/ || /hi/) && !/there/'

ফেরত: হাই থ্র

  • echo "hello there" | awk '(/hello/ || /hi/) && !/there/'

কিছুই দেয় না

  • echo "hi there" | awk '(/hello/ || /hi/) && !/there/'

কিছুই দেয় না


1
এটি আমার পক্ষে কাজ করেছে, তবে আমি রংগুলি হারিয়ে ফেলেছি = পি
লিওপল্ডো সান্জিক

1
কি আউটপুট থেকে রঙ? যদি আপনি ls দিয়ে রঙগুলি সংরক্ষণ করার চেষ্টা করছেন, "--color = সর্বদা" আর্গুমেন্টটি ব্যবহার করুন যখনই আউটপুট পার্সিং করবেন (বা পাঠ্যের বিশ্লেষণ করার সময় আপনি সাধারণত সবসময় রং হারাবেন)। উদাহরণ: ls --color=always | awk '/hello/ && !/goodbye/'
ফিলিপ রিজ

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

1

আমার পরীক্ষা-নিরীক্ষাগুলি থেকে আপনি যদি আপনার বর্জনীয় শর্তাদি grepবা এর মাধ্যমে পাইপ করেন তবে এটি খুব বেশি পার্থক্য করতে পারে না sed। শেডে আরও কিছু দরকারী পাঠ্য প্রতিস্থাপনের বৈশিষ্ট্য রয়েছে যা আমি প্রায়শই লগ ফাইলগুলির আউট পুট আরও ভাল ফিল্টার করতে ব্যবহার করি। আমি সেড ব্যবহার করতে যাচ্ছি হিসাবে আমি সেড উপর ফিল্টার বেশিরভাগ একত্রিত।

wc /var/log/tomcat/tomcat.2013-01-14.log.1 
  1851725

 / ইউএসআর / বিন / সময় গ্রেপ -i -E "(লগইন ম্যানেজার)" /var/log/tomcat/tomcat.2013-01-03.log.1 | sed -e "/ লগইন ঠিক আছে / d" -e "/ লগইন সমাপ্ত / d" | wc-
24.05user 0.15 সিস্টেম 0: 25.27 বিভক্ত 95% সিপিইউ (0avgtext + 0avgdata 3504 ম্যাক্সারসিডেন্ট) কে
0 ইনপুট + 0 আউটপুট (0 মজোর + 246 মিনার)
   5614 91168 1186298

 / ইউএসআর / বিন / সময় গ্রেপ -i -E "(লগইন ম্যানেজার)" /var/log/tomcat/tomcat.2013-01-03.log.1 | sed -e "/ লগইন ঠিক আছে / d" -e "/ লগইন সমাপ্ত / d" | wc-
23.50user 0.16 সিস্টেম 0: 24.48 বিভক্ত 96% সিপিইউ (0avgtext + 0avgdata 3504 ম্যাক্সারসিডেন্ট) কে
0 ইনপুট + 0 আউটপুট (0 মজোর + 246 মিনার)
   5614 91168 1186298

 / ইউএসআর / বিন / সময় গ্রেপ -i -E "(লগইন ম্যানেজার)" /var/log/tomcat/tomcat.2013-01-03.log.1 | grep -v -e "লগইন ঠিক আছে" -e "লগইন সমাপ্ত" | wc-
23.08user 0.14 সিস্টেম 0: 23.55 98% সিপিইউ বিভক্ত (0avgtext + 0avgdata 3504 ম্যাক্সারসিডেন্ট) কে
0 ইনপুট + 0 আউটপুট (0 মজোর + 246 মিনার)
   5614 91168 1186298

 / ইউএসআর / বিন / সময় গ্রেপ -i -E "(লগইন ম্যানেজার)" /var/log/tomcat/tomcat.2013-01-03.log.1 | grep -v -e "লগইন ঠিক আছে" -e "লগইন সমাপ্ত" | wc-
23.50user 0.15 সিস্টেম 0: 25.27 বিভক্ত 93% সিপিইউ (0avgtext + 0avgdata 3488 ম্যাক্সেসিডেন্ট) কে
0 ইনপুট + 0 আউটপুটস (0 মজোর + 245 মিনোর) পৃষ্ঠাফোল্ট 0 স্ব্যাপস
   5614 91168 1186298


3
এর grep -Fপরিবর্তে রানটাইম তুলনা করার চেষ্টা করুন grep -Eএবং আপনার প্রয়োজন না -iহলে ব্যবহার করবেন না।
থোর

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