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


উত্তর:


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.