গ্রেপ সহ সঠিক স্ট্রিংটি সন্ধান করুন


9

উদাহরণস্বরূপ, আমি অনেক ইমেল ঠিকানা সহ একটি বড় টেক্সট ফাইল করেছি, ব্যাশ ব্যবহার করে আমার সন্ধান প্রয়োজন / যাচাই করা দরকার যে কোনও ইমেল রয়েছে (বা নেই)। "অ্যাঙ্কারস" (শুধুমাত্র) ব্যবহার করা উচিত?

grep '^user1@example.com' text_file

না আরও ভাল উপায় আছে? আমার একটি বাশ স্ক্রিপ্ট তৈরি করা দরকার এবং আমি নিরাপদ থাকতে চাই।


1
ইমেল কি কোনও লাইনের একমাত্র শব্দ?
গ্লেন জ্যাকম্যান

প্রকৃতপক্ষে: ফাইলটির এই ফর্ম্যাটটি রয়েছে: user1@example.com উদাহরণ.com/user1
পোল হ্যালেন

1
grep -q '^user1@example\.com\>'সেক্ষেত্রে , আমি ব্যবহার করব - শুরুতে একটি লাইন অ্যাঙ্কর এবং শেষে একটি শব্দের অ্যাঙ্কর।
গ্লেন জ্যাকম্যান

উত্তর:


24

দেখুন -F(স্থির স্ট্রিং, যেমন রেগুলার এক্সপ্রেশন উল্টোদিকে) এবং -x(: পুরো লাইন মেলে সঠিক) অপশন।

grep -Fx user1@example.com text_file

এর সমতুল্য হবে:

grep '^user1@example\.com$' text_file

(মনে রাখবেন এটি .নিয়মিত এক্সপ্রেশন অপারেটর যা কোনও চরিত্রের সাথে মেলে)।

-qবিকল্পটি ব্যবহার করুন যদি আপনি কেবল এই জাতীয় লাইন আছে কিনা তা পরীক্ষা করতে চান:

grep -Fxq user1@example.com text_file &&
  echo yes, that address is in that file.

যদি অনুসন্ধানের লাইন এবং ফাইলটির নাম পরিবর্তনশীল হয়:

grep -Fxqe "$email" < "$file"

অথবা

grep -Fxq -- "$email" < "$file"

আপনি চান না:

grep -Fxq "$email" "$file"

যে সমস্যা $emailবা যদি $fileশুরু সঙ্গে সমস্যা হতে পারে -

যদি ফাইলটি বাছাই করা হয় (আপনার বর্তমান লোকালয়ে, Cসর্বাধিক), আপনি সম্ভবত এর commপরিবর্তে জিনিসগুলি গতি বাড়িয়ে তুলতে পারেন grep:

printf '%s\n' user1@example.com | comm -12 - text_file

সুবিধাটি আরও স্পষ্ট হয়ে উঠবে যখন আপনার চেক করার জন্য বেশ কয়েকটি ইমেল ঠিকানা রয়েছে (উদাহরণস্বরূপ অন্য সাজানো ফাইলে):

comm -12 text_file emails_to_check

এর চেয়ে দ্রুত হবে:

grep -Fxf emails_to_check text_file

আফাইকও grep -Fxq -- "$email" "$file"কাজ করে।
ভিঙ্ক 17

স্টেফেন, কেন আপনি একটি ফাইল ইনপুট (গ্রেপ দ্বারা পরিচালিত) থেকে <রিডাইরেক্টর ব্যবহার করে স্টিডিনে স্যুইচ করলেন ? কোন সুবিধা আছে?
umläute

@ umläute এবং vinc17। আমি আগেই বলেছি, এটা দিয়ে শুরু ফাইলের নামের জন্য আবরণ এর -। এমনকি grep -- "$email" "$file"নামক একটি ফাইলের জন্য একটি সমস্যা হবে -(যা grepবিশেষভাবে অর্থ একইরূপে stdin )
Stéphane Chazelas

6

যথাসম্ভব দক্ষ হতে, আপনি প্রথম ম্যাচটি খুঁজে পাওয়ার পরে থামতে চান want আপনার যদি জিএনইউ থাকে তবে grepআপনি এটি করতে পারেন:

grep -m 1 '^user1@example\.com$' your_file

যদি আপনি এটি না করেন তবে আপনি পার্ল ব্যবহার করতে পারেন:

perl -nlE 'say and last if $_ eq q{user1@example.com}' your_file

4
-mজিএনইউ নির্দিষ্ট। -qআপনি যদি দক্ষতার সাথে পরীক্ষা করতে চান যে এমন একটি লাইন আছে তা পজিক্স ব্যবহার করুন ।
স্টাফেন চেজেলাস

3

সেখানে অনেকগুলি ইমেল চেক রয়েছে। এর মধ্যে একটি হ'ল:

grep -E -o "\b[a-zA-Z0-9.-]+@[a-zA-Z0-9.-]+\.[a-zA-Z0-9.-]+\b" text_file

আমার উত্তরটি বিস্তারিতভাবে জানাতে।

আপনি ^অ্যাঙ্কর ব্যবহার করছেন যা স্ট্রিংয়ের সূচনা নির্দেশ করে। কোনও ইমেল ঠিকানা দীর্ঘ স্ট্রিংয়ের মধ্যে কোথাও থাকলে এটি মিলবে না।


2
ধন্যবাদ। এটি একটি জেনেরিক গ্রেপ বিকল্প যা কোনও ফাইলে থাকা সমস্ত ইমেল ঠিকানা "নিষ্কাশন" করতে পারে। EMAIL পড়ুন এবং এরপরে গ্রেপ ব্যবহার করে এটি পরীক্ষা করার জন্য আমাকে একটি করে ইমেল ঠিকানা অনুসন্ধান করতে হবে।
পোল হ্যালেন

2

আপনার grepকমান্ড ^user1@example.comইমেলের ঠিকানা নিজেই সহ, যা শুরু হয় তার সাথে মিলবে user1@example.com.spammer.com। যেহেতু .নিয়মিত এক্সপ্রেশনগুলির মধ্যে একটি বিশেষ চরিত্র যা কোনও চাবিটির সাথে মেলে, আপনার এটি এড়ানো উচিত\.

ধরে নিচ্ছেন যে আপনার টেক্সটফাইলে প্রতি লাইনে একটি ঠিকানা রয়েছে, ব্যবহার করুন:

EMAIL=user1@example\\.com
egrep "^${EMAIL}$" text_file

অগ্রগতি $ইমেল ঠিকানা পরে লাইন শেষ হবে তা নিশ্চিত করবে। আমি ডাবল-কোটগুলিও ব্যবহার করছি ", কারণ এগুলি ভেরিয়েবলগুলি ব্যবহার করতে দেয় (একক-কোটের বিপরীতে ')


1
সেটিও মেলে user1@example-com
স্টাফেন চেজেলাস

@ স্টাফেন চ্যাজেলাস আপনি অবশ্যই ঠিক আছেন; উত্তর আপডেট।
umläute

@ umläute আপনার ব্যাকস্ল্যাশ দ্বিগুণ করতে হবে। তবে এটি ব্যবহার করা ভাল -Fx
ভিঙ্ক 17

@ ভিঙ্ক 17, দোহ; বাশ পালানো; যাইহোক, হ্যাঁ আমি সম্মত হই যে এটি ব্যবহার করা ভাল -Fxতবে এটি
স্টেফেনের

0

সাধারণ আক্ষরিক / সঠিক স্ট্রিং ম্যাচ বিবেচনা করে:

grep -w "search_word" <file>  >  output.txt

#\b shows boundaries over here.

বা,

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