আমি গ্রেপ দিয়ে কীভাবে একটি শব্দ বাদ দিতে পারি?


উত্তর:


801

আপনি এটি গ্রেপের বিকল্প হিসাবে -v(এর জন্য --invert-match) বিকল্পটি ব্যবহার করে করতে পারেন :

grep -v "unwanted_word" file | grep XXXXXXXX

grep -v "unwanted_word" fileরয়েছে এমন রেখাগুলি ফিল্টার করবে unwanted_wordএবং grep XXXXXXXXকেবল প্যাটার্নের সাথে রেখা তালিকাবদ্ধ করবে XXXXXXXX।

সম্পাদনা করুন:

আপনার মন্তব্য থেকে দেখে মনে হচ্ছে আপনি এটি ছাড়াই সমস্ত লাইন তালিকাভুক্ত করতে চান unwanted_word। সেক্ষেত্রে আপনার যা প্রয়োজন তা হ'ল:

grep -v 'unwanted_word' file

2
আমি যদি "অযাচিত শব্দ" দিয়ে লাইনের পরে এন লাইনগুলি বাদ দিতে চাই তবে কী হবে? -v 'unwanted_word' --after Nসাহায্য করে না কারণ এটি পরে লাইন এবং এন লাইনগুলিকে অন্তর্ভুক্ত করে।
— আন্দ্রে রেজেন্টভ

-vবা --invert-matchমিল না-করা লাইনগুলি নির্বাচন করুন। আপনার ক্ষেত্রে grep -v 'unwanted_word' fileবা grep --invert-match 'unwanted_word' file।
— adamski.pro

আমি উপরের এক লাইন এবং নীচের এক লাইনের সাথে মিলের প্যাটার্নটি উপেক্ষা করতে চাই তবে আমি কীভাবে এটি অর্জন করতে পারি?
— কানজি ভিরোজ

আশ্চর্যজনক, আমি এটি দ্রুত আমার রেপো স্থিতি অনুধাবন করতে গিটতে ব্যবহার করি, কবজির মতো কাজ করে:git status -s |grep -v "folder_I_dont_care"
— বেনজামিনজ

3
অদ্ভুত, এটি শীর্ষ উত্তর, তবে কিছু ক্ষেত্রে এটি ভুল! যদি আমি খুঁজতে চান sun, যখন এটি ছাড়া sunrise, grep sun|grep -v sunriseলাইন উভয় ধারণ অগ্রাহ্য sunএবং sunriseএকযোগে যে আমি কি চাই না। grep -P 'sun(?!rise)'অনেক ভাল।
— গ্রীন

86

আমি "আমি কীভাবে কোনও শব্দের সাথে মেলে তবে অন্যটিকে বাদ দিই" হিসাবে এই প্রশ্নটি বুঝতে পেরেছিলাম, যার জন্য একটি সমাধান সিরিজের দুটি গ্রেপ: প্রথম গ্রেপ "ওয়ার্ড 2" বাদে "গ্রেড ওয়ার্ড 1", দ্বিতীয় গ্রেপকে খুঁজে পেয়েছিল:

grep "word1" | grep -v "word2"

আমার ক্ষেত্রে: আমাকে "প্লট" এবং "# প্লট" এর মধ্যে পার্থক্য করা দরকার যা গ্রেপের "শব্দ" বিকল্পটি ব্যবহার করবে না ("#" বর্ণানুক্রমিক না হয়ে)।

আশাকরি এটা সাহায্য করবে.


16
হাইলাইট করার জন্য আপনার ক্রমটি বিপরীত করা উচিত word1।
— ম্যাথু

1
আমি অনুমান করি যে উদাহরণের সাথে ফাইলের নামের জন্য একটি স্থানধারক যুক্ত করা স্পষ্ট হবে
— প্যাট্রিক

39

যদি আপনার grepপার্ল নিয়মিত মত প্রকাশের -Pবিকল্পটি সমর্থন করে তবে আপনি করতে পারেন (যদি বাশ; টিসিএসএস হলে আপনাকে এড়াতে হবে !):

grep -P '(?!.*unwanted_word)keyword' file

ডেমো:

$ cat file
foo1
foo2
foo3
foo4
bar
baz

আমাদের এখন fooবাদে সমস্ত তালিকাfoo3

$ grep -P '(?!.*foo3)foo' file
foo1
foo2
foo4
$ 

এই জন্য ধন্যবাদ, খুব দরকারী! আমি উল্লেখ করতে চাই যে
— গ্রেপ

2
নোট করুন যে grep -v -Pনিয়মিত অভিব্যক্তিতে অবহেলা ছাড়াই কাজ করে।
— সাইবারসফট

"যদি ব্যাশ ... আপনি পালিয়ে যেতে হবে !" । আপনাকে ধন্যবাদ, আপনাকে ধন্যবাদ আপনাকে ধন্যবাদ! এটাই আমি চেয়েছিলাম!
— গ্যাব্রিয়েল স্টেপলস

36

সঠিক সমাধানটি grep -v "word" fileএর awkসমতুল্য সহ ব্যবহার করা :

awk '!/word/' file

তবে, যদি আপনার আরও জটিল পরিস্থিতি ঘটে থাকে যেখানে আপনি চান, বলুন, XXXউপস্থিত হন এবং উপস্থিত YYY না হন, তবে awkবেশ কয়েকটি grepএস পাইপ না দিয়ে চলে আসে :

awk '/XXX/ && !/YYY/' file
#    ^^^^^    ^^^^^^
# I want it      |
#            I don't want it

আপনি আরও জটিল কিছু বলতে পারেন। উদাহরণস্বরূপ: আমি সেই লাইনগুলি দুটি XXXবা একটি সহ চাই YYY, তবে চাই না ZZZ:

awk '(/XXX/ || /YYY/) && !/ZZZ/' file

প্রভৃতি


2
এটি grep -Pবড় ফাইলগুলির সমাধানের চেয়ে অনেক দ্রুত গতিযুক্ত বলে মনে হয় ।
— এমবিআর

@ এমবিআর grep -Pমানে পার্ল রিজেক্সপ ব্যবহার করা, সুতরাং সেই প্যাকেজটি লোড করা স্বাভাবিকের চেয়ে ব্যয়বহুল হতে চলেছে grep।
— ফেডরকিই 'এসও ক্ষতিগ্রস্থ হওয়া বন্ধ করুন'


6

গ্রেপ নন-মিলনকারী লাইনগুলি নির্বাচন করতে '-v' বা '--invers-ম্যাচ' বিকল্প সরবরাহ করে।

যেমন

grep -v 'unwanted_pattern' file_name

এটি ফাইল ফাইল নাম থেকে সমস্ত লাইন আউটপুট দেবে, যার 'অযাচিত_প্যাটার্ন' নেই।

যদি আপনি কোনও ফোল্ডারের অভ্যন্তরে একাধিক ফাইলে প্যাটার্নটি সন্ধান করে থাকেন তবে আপনি নিম্নলিখিত হিসাবে পুনরাবৃত্ত অনুসন্ধান বিকল্পটি ব্যবহার করতে পারেন

grep -r 'wanted_pattern' * | grep -v 'unwanted_pattern'

এখানে গ্রেপ বর্তমান ডিরেক্টরি থেকে সমস্ত ফাইলের মধ্যে 'ওয়ান্ট_প্যাটার্ন' এর সমস্ত উপস্থিতি তালিকাভুক্ত করার চেষ্টা করবে এবং 'অযাচিত_প্যাটার্ন' ফিল্টার করার জন্য এটি দ্বিতীয় গ্রেপ-এ পাস করবে। '|' - পাইপ শেলকে বাম প্রোগ্রামের স্ট্যান্ডার্ড আউটপুট (গ্রেপ -আর 'ওয়ান্ড_প্যাটার্ন' *) সাথে ডান প্রোগ্রামের মান ইনপুট (গ্রেপ-ভি 'অবাঞ্ছিত_প্যাটার্ন') এর সাথে সংযোগ করতে বলবে।


4

-vবিকল্প আপনি সব লাইন যে প্যাটার্ন মিলছে না দেখাবে।

grep -v ^unwanted_word

-5

আমার কাছে একগুচ্ছ ফাইলের ডিরেক্টরি রয়েছে। "স্পিডআপ" স্ট্রিং না থাকা সমস্ত ফাইল আমি সন্ধান করতে চাই তাই আমি নিম্নলিখিত কমান্ডটি সফলভাবে ব্যবহার করেছি:

grep -iL speedup *

1
ম্যান পৃষ্ঠা থেকে: "-এল, - ফাইলস-ম্যাচ ছাড়াই স্বাভাবিক আউটপুট দমন করে; পরিবর্তে প্রতিটি ইনপুট ফাইলের নাম মুদ্রণ করুন যা থেকে কোনও আউটপুট সাধারণত মুদ্রিত হত না been স্ক্যানিংটি প্রথম ম্যাচে থামবে on " (জোর দেওয়া আমার দ্বারা) সুতরাং এ থেকে সাবধান!
— xuiqzy
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.