কিছু নিদর্শন বাদ দিয়ে কীভাবে গ্রেপ করবেন?


87

আমি কিছু প্যাটার্নের উপস্থিতি এবং অন্য কোনও প্যাটার্নের অনুপস্থিতি সহ ফাইলগুলিতে লাইনগুলি সন্ধান করতে চাই। উদাহরণস্বরূপ, আমি অন্তর্গত সব ফাইল / লাইন খুঁজুন loomসঙ্গে তাদের ছাড়া gloom। সুতরাং, আমি loomকমান্ড দিয়ে খুঁজে পেতে পারি :

grep -n 'loom' ~/projects/**/trunk/src/**/*.@(h|cpp)

এখন, আমি loomবাদ দিয়ে অনুসন্ধান করতে চাই gloom। তবে, নিম্নলিখিত দুটি নির্দেশই ব্যর্থ হয়েছে:

grep -v 'gloom' -n 'loom' ~/projects/**/trunk/src/**/*.@(h|cpp)
grep -n 'loom' -v 'gloom' ~/projects/**/trunk/src/**/*.@(h|cpp)

আমার লক্ষ্য অর্জনের জন্য আমার কী করা উচিত?

সম্পাদনা 1: আমি বোঝাতে চাইছিloomএবংgloomএটি চরিত্রের অনুক্রমগুলি (অগত্যা শব্দগুলি নয়)। সুতরাং, আমার প্রয়োজন, উদাহরণস্বরূপ,bloombergকমান্ড আউটপুটে এবং দরকার নেইungloomy

সম্পাদনা 2: আমার প্রত্যাশার নমুনা রয়েছে। নিম্নলিখিত উভয় লাইন কমান্ড আউটপুটে রয়েছে:

আমি ধূপের ওড়না দিয়ে .ুকে পড়ে থাকা আইকনগুলির মুখোমুখি হয়েছি ।

Arty হয় slooming একটি মনমরা দিন।

নিম্নলিখিত উভয় লাইন কমান্ড আউটপুটে নেই:

এটি গ্লোমোইন 'পাওয়ার ভয়ঙ্কর - দুর্দান্ত মাকল ডল্ডার ও' ক্লোডস।

দক্ষিণ পশ্চিম রাউন্ডে হাই পাইটিট হলের


আপনি কি এমন ফাইল সন্ধান করছেন যা আপনার মাপদণ্ডের সাথে মেলে এমন রেখাগুলির আপনার মানদণ্ডের সাথে মেলে?
জুলু

আমি আমার মানদণ্ডের সাথে মিল রেখে লাইনগুলির সাথে ফাইলগুলি সন্ধান করছি। এবং আমি সমস্ত সেট ফাইলের তালিকা + মিলের লাইন + মিলের লাইনের সংখ্যা নিজেই দেখতে চাই।
তাঁত

যদি লাইনটি ছিল there is a loom in the gloom- আপনি কি সেই লাইনটি প্রিন্ট করতে চান? কেবলমাত্র আপনি লাইনগুলি সন্ধান করছেন কিনা তা বোঝার চেষ্টা করছেন যেখানে আঁতকে ওঠার অংশ ব্যতীত অন্যদিকে তাঁত ঘটে বা আপনি যদি সত্যই আঁশযুক্ত লাইনগুলি লাইনটির অন্য কোথাও তার নিজের উপর উপস্থিত হয়েও বাদ দিতে চান। কিছু নমুনা ইনপুট এবং প্রত্যাশিত আউটপুট পোস্ট করা সহায়তা করবে।
এড মর্টন

তাহলে আপনার প্রশ্ন আসলেই How do I find lines containing the string "loom" where "loom" is not preceded by the letter "g"? আপনি যদি কিছু নমুনা ইনপুট এবং পছন্দসই আউটপুট পোস্ট করেন যা অনেক উপকার করতে পারে। এই প্রশ্নের উত্তর নীচের উত্তরগুলিতে অন্তর্ভুক্ত করা হয়েছে।
এড মর্টন

4
@EdMorton - হ্যাঁ, আপনি করছেন ডান - আমি সব লাইন প্রয়োজন, যেখানে দেখা দিলে loomছাড়া পূর্বে g। (আমি দুঃখিত। আমি গতকাল মন্তব্য করা শুরু করেছি, তবে কখনই শেষ হয়নি। ঘটনাক্রমে এই মন্তব্যটি পাঠানো হয়েছিল))
লুম

উত্তর:


105

কিভাবে গ্রেপস শৃঙ্খল সম্পর্কে?

grep -n 'loom' ~/projects/**/trunk/src/**/*.@(h|cpp) | grep -v 'gloom'

13
ঠিক সময়ে. নিখুঁতভাবে কাজ করে। -v হল বাদ দেওয়ার বিকল্প। ধন্যবাদ
রবি কৃষ্ণ পি

4
প্রশ্ন থেকে: সুতরাং, আমার প্রয়োজন, উদাহরণস্বরূপ, bloombergকমান্ড আউটপুটে এবং প্রয়োজন নেই ungloomy যদি একটি একক লাইন থাকে ... ... এবং ব্লুমবার্গ সম্ভাবনার বিষয়ে অনর্গল হয় ... ', আপনি সেই লাইনটি সরিয়ে ফেলবেন তবে এটি চাওয়া হয়েছে (কারণ এতে রয়েছে bloomberg)।
জোনাথন লেফলার

23

শৃঙ্খলা ছাড়াই আরেকটি সমাধান grep:

egrep '(^|[^g])loom' ~/projects/**/trunk/src/**/*.@(h|cpp)

বন্ধনীগুলির মধ্যে, যে gকোনও ঘটনার আগে আপনি অক্ষরটিকে বাদ দেন loom, যদি loomনা লাইনটির প্রথম অক্ষর হয়।


9

কিছুটা বয়স্ক, তবে ওহ ভাল ...

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

grep -n 'loom' ~/projects/**/trunk/src/**/*.@(h|cpp) | grep -v 'gloom'

পরিবর্তে, বেন্টয় 13 এর egrep রেজেক্স উদাহরণটি আরও ভাল কাজ করে

egrep '(^|[^g])loom' ~/projects/**/trunk/src/**/*.@(h|cpp)

এটিতে "তাঁত" যুক্ত যে কোনও লাইন এতে অন্তর্ভুক্ত থাকবে, এতে "গ্লোম" রয়েছে কিনা তা নির্বিশেষে। অন্যদিকে, যদি এটি কেবল অন্ধকার করে তবে এটি এটি অন্তর্ভুক্ত করবে না, এটি হ'ল ওপি চায় এমন আচরণ is


8

কেবল জঞ্জাল ব্যবহার করুন, আপনাকে যৌগিক পরিস্থিতি স্পষ্টভাবে প্রকাশ করতে দেওয়া এই গ্রেপের চেয়ে অনেক সহজ।

আপনি যদি উভয় লাইনগুলিতে loomএবং gloom:

awk '/loom/ && !/gloom/{ print FILENAME, FNR, $0 }' ~/projects/**/trunk/src/**/*.@(h|cpp)

অথবা আপনি যদি এগুলি মুদ্রণ করতে চান:

awk '/(^|[^g])loom/{ print FILENAME, FNR, $0 }' ~/projects/**/trunk/src/**/*.@(h|cpp)

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

awk '/\<loom\>/{ print FILENAME, FNR, $0 }' ~/projects/**/trunk/src/**/*.@(h|cpp)

4
আপনি একটি grep কমান্ড প্রয়োগ লিখতে চাই লাইন যেগুলিতে পেতে সম্পর্কে চিন্তা করুন abcএবং defএবং ghiকোন যাতে। এখন যে তুলনা awk '/abc/ && /def/ && /ghi/'। এখন awk '/loom/ && !/gloom/'এই পৃষ্ঠায় উত্তরগুলিতে গ্রেপের সমতুল্য কীভাবে লেখা হচ্ছে তা চিন্তা করুন।
এড মর্টন

আমি জারজির সাথে খুব বেশি পরিচিত নই, দৃশ্যত এই আদেশটির নিজস্ব নিজস্ব বই রয়েছে। আপাতত আমি গ্রেপ দিয়ে ভাল আছি, একদিন আমিও একই কথা বলব আপনি যা করেছেন। :)
Juto

4
awk হ'ল পাঠ্য ফাইলগুলি প্রক্রিয়াকরণের জন্য মানক ইউএনএক্স সরঞ্জাম (যেমন সমস্ত ইউনিক্স ইনস্টলেশনে উপলব্ধ)। এটিই এটি করার জন্য উদ্ভাবিত হয়েছিল এবং এটি এটিতে খুব ভাল। আপনি যদি ইউনিক্স এবং পাঠ্য ফাইলগুলি পার্সিং করে থাকেন তবে আর্নল্ড রবিন্সের তৃতীয় সংস্করণ ইফেক্টিভ অ্যাওক প্রোগ্রামিং বইটি থেকে শিখুন। আফস condition { action }সিনট্যাক্সের সাথে সম্পর্কিত হতে একটি ছোট ছোট দৃষ্টান্তের শিফট রয়েছে তবে তারপরে এটি কোনও সি বা অন্য কোনও আলগোল-বেস ভাষার অভিজ্ঞতার সাথে বাতাসের বাতাস।
এড মর্টন

বোনাস: আউটপুট এর মতো grep -Hn --color:awk '/loom/ && !/gloom/ { gsub(/loom/, color("1;31") "&" color(0)); print color(35) FILENAME color(36) ":" color(32) FNR color(36) ":" color(0) $0; }; function color(c) { return "\033[" c "m"; }'
জট

6

-v "উল্টানো ম্যাচ" পতাকা, তাই পাইপিং খুব ভাল উপায়:

grep "loom" ~/projects/**/trunk/src/**/*.@(h|cpp)| grep -v "gloom"


5

/ * আপনি কি এরকম কিছু খুঁজছেন?

grep -vn "gloom" `grep -l "loom" ~/projects/**/trunk/src/**/*.@(h|cpp)`

BACKQUOTES কমান্ডগুলির জন্য বন্ধনীগুলির মতো ব্যবহৃত হয়, সুতরাং সক্ষেত্রে এই ক্ষেত্রে -l, বাক্সকোয়েটসের কোডটি আপনাকে ফাইলের নামগুলি ফিরিয়ে দেবে, তারপরে আপনি যা চান তা করতে -vn সহ: ফাইলের নাম, লিনেন নম্বর এবং আসল লাইনও রয়েছে।

আপডেট বা এক্সগার্স সহ

grep -l "loom" ~/projects/**/trunk/src/**/*.@(h|cpp) | xargs grep -vn "gloom"

আশা করি এইটি কাজ করবে.*/

আমি উপরে যা লিখেছি তা উপেক্ষা করুন, এটি আবর্জনা।

grep -n "loom" `grep -l "loom" tt4.txt` | grep -v "gloom"

               #this part gets the filenames with "loom"
#this part gets the lines with "loom"
                                          #this part gets the linenumber,
                                          #filename and actual line

4

আপনি grep -Pসমর্থিত (পার্ল রেজেক্স) ব্যবহার করতে পারেন negative lookbehind:

grep -P '(?<!g)loom\b' ~/projects/**/trunk/src/**/*.@(h|cpp)

আমি \bশব্দ সীমানা জন্য যুক্ত ।


4
আপনার \([^g]\|^\)কাজের দরকার নেই, কাজ করে। এবং এটি উভয় loomএবং এর সাথে লাইনগুলি বাদ দেয় না gloom
কেভিন

@ কেভিন: ওপি তাঁতযুক্ত লাইনগুলি সন্ধান করতে চাইছে তবে not gloom
অনুভা

হুবহু যদি কোনও লাইনে উভয় থাকে তবে সে এটি চায় না তবে এটি এটি যেভাবেই মিলবে।
কেভিন

@ কেভিন: এটি গ্লানির সাথে মেলে না তবে তাঁতের সাথে মিলবে (ওপি যেমন চায়)
অনুভা

প্রশ্ন থেকে: সুতরাং, আমার প্রয়োজন, উদাহরণস্বরূপ, bloombergকমান্ড আউটপুটে এবং প্রয়োজন নেই ungloomy সুতরাং, সীমানা শব্দটি বিপরীত।
জোনাথন লেফলার

3
grep -n 'loom' ~/projects/**/trunk/src/**/*.@(h|cpp) | grep -v 'gloom'

প্রশ্ন থেকে: সুতরাং, আমার প্রয়োজন, উদাহরণস্বরূপ, bloombergকমান্ড আউটপুটে এবং প্রয়োজন নেই ungloomy যদি একটি একক লাইন থাকে ... ... এবং ব্লুমবার্গ সম্ভাবনার বিষয়ে অনর্গল হয় ... ', আপনি সেই লাইনটি সরিয়ে ফেলবেন তবে এটি চাওয়া হয়েছে (কারণ এতে রয়েছে bloomberg)।
জোনাথন লেফলার

@ জোনাথনলফলার "আমার কাছে বিষাদযুক্ত ব্যতীত তাঁত সহ সমস্ত ফাইল / লাইন সন্ধান করা উচিত।"
জিমিনিয়ন

3

সহজভাবে ব্যবহার করুন! grep -vএকাধিক বার.

ফাইলের বিষয়বস্তু

[root@server]# cat file
1
2
3
4
5

লাইনটি বা ম্যাচটি বাদ দিন

[root@server]# cat file |grep -v 3
1
2
4
5

লাইনটি বাদ দিন বা একাধিক মিল করুন

[root@server]# cat file |grep -v 3 |grep -v 5
1
2
4

0

প্রশ্ন: 'গ্লান' বাদ দিয়ে 'তাঁত' অনুসন্ধান করুন।
উত্তর:

grep -w 'loom' ~/projects/**/trunk/src/**/*.@(h|cpp)

4
প্রশ্ন থেকে: সুতরাং, আমার প্রয়োজন, উদাহরণস্বরূপ, bloombergকমান্ড আউটপুটে এবং প্রয়োজন নেই ungloomy আমি মনে করি না যে -wএটি সেই ধাঁধার সমাধান।
জোনাথন লেফলার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.