পুরো লাইনটি মেলে কীভাবে গ্রেপ তৈরি করতে হয়?


103

আমি এই আছে:

$ cat a.tmp
ABB.log
ABB.log.122
ABB.log.123

আমি এবিবি.লগের একটি সঠিক মিল খুঁজে পেতে চেয়েছিলাম।

কিন্তু যখন আমি করেছি

$ grep -w ABB.log a.tmp
ABB.log
ABB.log.122
ABB.log.123

এটি তাদের সমস্ত দেখায়।

গ্রিপ ব্যবহার করতে চাইলে আমি কী পেতে পারি?

উত্তর:


105

কেবল রিজেক্সপ অ্যাঙ্করগুলি নির্দিষ্ট করুন।

grep '^ABB\.log$' a.tmp

2
উভয় অ্যাঙ্কর (^ এবং $) প্রয়োজন।
user562374

2
সুন্দর! এবং যদি আমি কোনও ফাইল থেকে ম্যাচের জন্য রেজেক্স ব্যবহার করছি? "গ্রেপ -f নিদর্শন a.tmp" ??
সবুজ 69

@ সবুজ 69 বেশ কয়েক বছর দেরীতে, তবে আপনি sed -r "s/^(.*)$/^\1$/" patterns.txt | egrep -f - a.tmp
গ্রেটারে

155
grep -Fx ABB.log a.tmp

গ্রেপ ম্যান পৃষ্ঠা থেকে:

-এফ, - ফিক্সড-স্ট্রিংগুলি
PATTERN কে একটি (তালিকা হিসাবে) নির্দিষ্ট স্ট্রিং হিসাবে ব্যাখ্যা করে
--x, --line-regexp
কেবলমাত্র সেই ম্যাচগুলি নির্বাচন করুন যা পুরো লাইনের সাথে মেলে।


2
দুর্ভাগ্যক্রমে -F ব্যবহার করতে সক্ষম ছিল না।
জনি

@ জোহনি না -F? আপনি কি সোলারিসে আছেন? যদি তাই ব্যবহার হয়/usr/xpg4/bin/grep
স্ক্রুটিনাইজার

9
আমি grepব্যাশ স্ক্রিপ্টের ভিতরে ব্যবহার করছি এবং গ্রহণযোগ্য উত্তরে প্রস্তাবিত নিয়মিত অভিব্যক্তি ব্যবহার করার চেয়ে এই বিকল্পটি ভাল। কারণ ভেরিয়েবলের ভিতরে আমার কিছু বিশেষ চরিত্র রয়েছে যা আমি অনুসন্ধান করছি (যেমন .) এবং কমান্ডটি ব্যবহার করার সময় আমার সেগুলি থেকে বাঁচতে হবে না।
গুস্তাভো স্ট্রুব

1
সেরা উত্তর আইএমও কারণ এটি
এড়ানো

1
এটি আরও ভাল কারণ এটি ভেরিয়েবলগুলির সাথেও কাজ করে।
ইয়েঞ্জিরা

23

এখানে আমি যা করি তা হল, যদিও অ্যাঙ্করগুলি ব্যবহার করা সর্বোত্তম উপায়:

grep -w "ABB.log " a.tmp

এই মত .. এটি প্রথম লাইন ম্যাচ ফিরে আসবে
user765443

1
এটির পরে একটি স্থান প্রয়োজন ABB.logযা সাধারণ ক্ষেত্রে নয়, অর্থাত্‍ এটি বেশিরভাগ সময় ব্যর্থ হবে।
জাহিদ 14

3

একক নেতৃস্থানীয় বা অনুসরণযোগ্য স্থানের মতো এত বেশি পরিমাণে প্রস্তাবনা ব্যর্থ হবে, যা ফাইল হাতে হাতে সম্পাদনা করা হচ্ছে কিনা তা বিবেচ্য হবে। এটি সে ক্ষেত্রে এটি কম সংবেদনশীল করে তুলবে:

grep '^[[:blank:]]*ABB\.log[[:blank:]]*$' a.tmp

শেলের একটি সাধারণ যখন পঠনযোগ্য লুপ এটি স্পষ্টভাবে করতে পারে:

while read file
do 
  case $file in
    (ABB.log) printf "%s\n" "$file"
  esac
done < a.tmp


1

আমি ওপি এবং অন্যান্য উত্তরগুলির প্রচেষ্টা সম্পর্কে কিছু অতিরিক্ত ব্যাখ্যা যুক্ত করার ইচ্ছা করি।

আপনি জন কুগেলম্যানস এর সমাধানও এর মতো ব্যবহার করতে পারেন :

grep -x "ABB\.log" a.tmp

স্ট্রিংটি উদ্ধৃত করা এবং বিন্দু ( .) এড়ানোর ফলে -Fপতাকাটির আর দরকার হয় না ।

আপনাকে .(বিন্দু) এড়াতে হবে (কারণ এটি কোনও চরিত্রের সাথে মেলে (কেবল .পালানো না গেলে)) বা -Fগ্রেপ সহ পতাকাটি ব্যবহার করতে হবে । -Fপতাকা এটিকে একটি স্থির স্ট্রিং করে তোলে (কোনও রেজেক্স নয়)।

আপনি যদি স্ট্রিংটি উদ্ধৃতি না দিয়ে থাকেন তবে ডট ( .) থেকে রক্ষা পাওয়ার জন্য আপনার ডাবল ব্যাকস্ল্যাশ লাগতে পারে :

grep -x ABB\\.log a.tmp


টেস্ট:

$ echo "ABBElog"|grep -x  ABB.log
ABBElog #matched !!!
$ echo "ABBElog"|grep -x  "ABB\.log"
#returns empty string, no match


বিঃদ্রঃ:

  1. -x পুরো লাইন মেলে বাহিনী।
  2. পতাকা .ছাড়াই একটি অব্যাহত ব্যবহার করা উত্তরগুলি -Fভুল।
  3. আপনি এবং -xআপনার প্যাটার্নের স্ট্রিং মোড়ানো করে স্যুইচ এড়াতে পারবেন । এই ক্ষেত্রে তৈরী নিশ্চিত করুন যে আপনি ব্যবহার করবেন না , পরিবর্তে অব্যাহতি , কারণ এর Regex ব্যাখ্যা প্রতিরোধ করবে এবং ।^$-F.-F^$


সম্পাদনা: (@ হ্যাক্রে প্রসঙ্গে অতিরিক্ত ব্যাখ্যা যোগ করা হচ্ছে):

আপনি যদি কোনও স্ট্রিংটি শুরু করে মেলাতে চান -তবে আপনার --গ্রেপ ব্যবহার করা উচিত । নিম্নলিখিত যেগুলি --ইনপুট হিসাবে নেওয়া হবে (বিকল্প নয়)।

উদাহরণ:

echo -f |grep -- "-f"     # where grep "-f" will show error
echo -f |grep -F -- "-f"  # whre grep -F "-f" will show error
grep "pat" -- "-file"     # grep "pat" "-file" won't work. -file is the filename

আপনি কি সত্যিই অনুভব করেছেন যে -F আপনার ক্ষেত্রে অনুপস্থিত ছিল? যদি তা হয় তবে দয়া করে বলতে পারেন কোন ঘটনাটি ছিল?
হ্যাক্রে

@hakre আপনি আমার উত্তর পুরোপুরি পড়েছেন? আমি বুঝিয়েছি (বেশ পরিষ্কারভাবে) কেন সঠিকভাবে পালাতে পারলে -Fপ্রয়োজন হবে না .
জাহিদ

অবশ্যই। অবশ্যই, আমি কেবল জিজ্ঞাসা করছি: -Fআপনি এটি লেখার সময় উপস্থিত ছিলেন ? যদি না হয় তবে আপনি কোন সিস্টেমটি ব্যবহার করছেন? আমি এখনও আপনার উত্তরে সেই তথ্যটি খুঁজে পেলাম না, এটি আবার যখন আমি আবার পড়ি তখনও এটি। সত্যিই নিশ্চিত, আমি আপনার উত্তরটি কমপক্ষে দুবার পুরোপুরি পড়েছি। ;)
হ্যাক্রে

@hakre অবশ্যই -Fউপলব্ধ ছিল। (আমি বলেছিলাম: "বা এর -Fসাথে পতাকা ব্যবহার করুন grep")
জাহিদ

অন্তর্দৃষ্টি জন্য ধন্যবাদ। শুধু একটি লিটল প্রশ্ন বাকি: যদি-F এর উত্তর হয় তবে পালানোর বিষয়ে কেন বিরক্ত করবেন? সে সম্পর্কে আপনার মতামত কী?
hakre


-1
    $ cat venky
    ABB.log
    ABB.log.122
    ABB.log.123

    $ cat venky | grep "ABB.log" | grep -v "ABB.log\."
    ABB.log
    $

    $ cat venky | grep "ABB.log.122" | grep -v "ABB.log.122\."
    ABB.log.122
    $

1
এটি এবিবি.লগের সাথে শেষ হওয়া ফাইলগুলির সাথেও মিলবে এবং বিন্দুগুলি এড়ানো উচিত।
স্ক্রুটিনাইজার

-1

আমার জন্য কাজ করে :

grep "\bsearch_word\b" text_file > output.txt  

\b সীমানা নির্দেশ করে / নির্ধারণ করে।

বেশ দ্রুত কাজ করা লাগে


এটি search_wordশব্দের সীমানায় পৃথক থাকা কোনও লাইনের সাথেও মেলে । উদাহরণস্বরূপ, এটি "foo অনুসন্ধান_শব্দ বার" লাইনের সাথে মিলবে।
রোহান সিং

-2

এটি এইচপিউএক্সের সাথে রয়েছে, যদি ফাইলগুলির সামগ্রীতে শব্দের মধ্যে স্থান থাকে তবে এটি ব্যবহার করুন:

egrep "[[:space:]]ABC\.log[[:space:]]" a.tmp


ওপি পুরো লাইনের সাথে মিল রাখতে চেয়েছিল, লাইনের মধ্যে কোনও স্থান-বিস্মৃত শব্দ নয়।
কিথ থম্পসন


-3

আমার এই বৈশিষ্ট্যটির প্রয়োজন ছিল, তবে এটিও নিশ্চিত করতে চেয়েছিলাম যে আমি ABB.log এর আগে একটি উপসর্গ দিয়ে লাইনগুলি ফিরিয়ে দিইনি:

  • ABB.log
  • ABB.log.122
  • ABB.log.123
  • 123ABB.log

grep "\WABB.log$" -w a.tmp

এটি কেবল তখনই মিলবে যদি নেতৃস্থানীয় \Wসন্তুষ্ট হয়, যা কোনও অনাহারযুক্ত অক্ষর, তাই xABBxlog
bschlueter
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.