পাইপ গ্রেপ -v মধ্যে সন্ধান করুন


18

আমি সমস্ত ফাইলগুলি অনুসন্ধান করার চেষ্টা করছি যা একটি নির্দিষ্ট ধরণের এবং একটি নির্দিষ্ট স্ট্রিং না থাকে। আমি গ্রেপ-ভি-তে পাইপ পাইপ করে এটি সম্পর্কে চেষ্টা করার চেষ্টা করছি

উদাহরণ:

find -type f -name '*.java' | xargs grep -v "something something"

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

আমার সন্দেহ হ'ল আমি এটি ভুল করছি। সুতরাং পরিবর্তে কমান্ড দেখতে কেমন হবে?


আপনি এটি যুক্ত করতে পারেন যা আপনাকে মনে করে যে এটি কার্যকর হয়নি। হতে পারে আপনার গ্রেপ এক্সপ্রেশন খুব স্পষ্ট? সংবেদনশীলতার ক্ষেত্রে '-i' দরকার? আমার
উত্তরটিও

উত্তর:


21

এখানে কোন প্রয়োজন xargsনেই। এছাড়াও আপনি ব্যবহার করতে হবে grepসঙ্গে -L, বিকল্প (ম্যাচ ছাড়া ফাইল) অন্যথায় কারণ এটা করবে আউটপুট তার নামের পরিবর্তে ফাইল বিষয়বস্তু, আপনার উদাহরণে মত।

find . -type f -iname "*.java" -exec grep -L "something somethin" {} \+

1
-Lইতিমধ্যে আলোচনা আছে, কারণ এর অর্থ files _without_ match। অতএব আপনার -vএখানে বিকল্পের দরকার নেই।
নলখাগড়া

3
অতিরিক্ত + না শেষে।
lynxlynxlynx

2
@ user946850 প্রতিবার আমি যখন find -exec \+কেউ লিখি আমাকে লিখেছে যে xargs ব্যবহার করা আরও ভাল। কেন কেউ মন্তব্য লেখার আগে মানুষকে দেখায় না? (:
ভিড়ের

5
@ user946850 এর -exec ... {} \+সমতুল্য নয় xargs। দয়া করে সন্ধানকারী ডকুমেন্টেশন পড়ুন! (আমি এতে বেশ কঠোর পরিশ্রম করেছি!)
জেমস ইয়ংম্যান

2
@ user946850 হ্যাঁ। পার্থক্যের মধ্যে একটি হ'ল (ডিফল্টরূপে) xargsএর ইনপুটটি প্রসেস করে এবং সাদা জায়গাতে যুক্তি পৃথক করে। উদ্ধৃতিগুলিও বিশেষ (ডিফল্টরূপে) এর কাছে xargs। এই জিনিসগুলির জন্য কোনওটিই সত্য নয় -exec ... {} +। পুরাতন সংস্করণগুলি xargsইওএফ সূচক হিসাবে আন্ডারস্কোর বিবেচনা করত তবে এটি আর হয় না।
জেমস ইয়ংম্যান

7

আপনি এটি প্রায় পেয়েছেন ...

find . -type f -iname "*.java" -print0 | xargs -0 grep -v "something something"

বিন্দু '।' এখানে থেকে শুরু করতে বলে। (আপনার এটি বোঝায় .. তবে কখনও অনুমান করবেন না)।

-নামটি কেবলমাত্র ক্ষেত্রে (বা কেবল কোনও ক্ষেত্রে নয়) কেস-সংবেদনশীল অনুসন্ধান ব্যবহার করে।
-প্রিন্ট0 একটি ট্রেলিং \ x00 অক্ষর সহ এক্সার্গারে ফাইলের নাম পাঠায়, যা ফাইলের নামগুলির মধ্যে ফাঁকা থাকার সমস্যা রোধ করে।

xargs-তে '-0' বলছে ফাইলের নামগুলি রিটার্নের পরিবর্তে \ x00 দিয়ে শেষ হবে expect

এবং আপনার গ্রেপ কমান্ড ...

বেশ পেয়েছে।


সম্পাদনা ::

আপনার আপডেট থেকে:

find . -type f -iname "*pb.java" -print0 | xargs -0 grep -iL "something"

সাহায্য করা উচিত। (@ রাশ এর উত্তর, ভাল কাজ থেকে যোগ করা এল)

আমি ধারণাটি পেয়েছি যে আপনার গ্রেপকে হয় '-i' বিকল্পের প্রয়োজন হয় বা কম স্পষ্ট হওয়া উচিত।

অংশগুলিতে কমান্ড চেষ্টা করুন ... এই আউটপুট ফাইলের নামগুলি কি যথাযথ বলে মনে হচ্ছে?

find . -type f -iname "*pb.java"

যদি তাই হয় তবে আপনার সমস্যাটি সম্ভবত হয় আপনার গ্রেপ অনুসন্ধানের ধরণটি মেলে না (বানান ত্রুটি? এটি ঘটে!), বা কেবল কোনও মিল নেই।

সম্পূর্ণ খারাপ পরিস্থিতি:

grep -riL "something" *

সমস্ত কিছু অনুসন্ধান করার জন্য আরও অনেক কাজ করবে, তবে আপনাকে কিছু আউটপুট দেওয়া উচিত।


আমি আপনার পরিবর্তনগুলি চেষ্টা করেছি এবং এখনও আমি যে ফলাফলটি প্রত্যাশা করছি তা পাচ্ছি না। প্রশ্নটি আরও পরিষ্কার করার জন্য আপডেট করার চেষ্টা করব।
হ্যাঞ্জেলো

যদি প্রশ্নটির লেখক কেবল ফাইলের নামগুলি সন্ধান করতে চান তবে গ্রেপটি 'গ্রেপ-এল-ভি' হওয়া উচিত নয়?
ব্রুস এডিগার

তিনি * .java ফাইলের মধ্যে নির্দিষ্ট বিষয়বস্তু খুজছে
lornix

xargs -0 grep -v "something something"xargs -0 grep -v "something something" /dev/nullঅন্যথায় হওয়া উচিত যখন আপনি কোনও মিল পাওয়া যায় না এমন ফাইলগুলি তৈরি করার সময় আপনি বিজোড় ফলাফল পাবেন।
জেমস ইয়ংম্যান

{গ্রিন} হ্যাঁ, কোথাও কোথাও যুক্তিটি সমস্ত লোমশ হয়ে উঠেছে। আপনার মাথাতে আঘাত লাগানোর জন্য কোনও বিপরীত মিথ্যা যুক্তিযুক্ত একাধিক পরীক্ষার মতো নয়।
লার্নিক্স

4

কম্পিউটারটি একটি কম্পিউটার হচ্ছে: এটি আপনি যা করতে চেয়েছিলেন তার পরিবর্তে আপনি যা করতে বলেছেন তা করছে doing

grep -v "something something"ধারণ করে না এমন সমস্ত লাইন মুদ্রণ করে something something। উদাহরণস্বরূপ, এটি নিম্নলিখিত তিনটির মধ্যে দুটি লাইন প্রিন্ট করে:

hello world
this is something something
something else

extends SomethingSomethingকোথাও নেই এমন ফাইলগুলি মুদ্রণের জন্য, -Lবিকল্পটি ব্যবহার করুন :

grep -L -E 'extends[[:space:]]+SomethingSomething' FILENAME…

গ্রেপের কিছু সংস্করণে -Lবিকল্প নেই (এটি পসিক্স দ্বারা নির্দিষ্ট করা হয়নি )। যদি আপনার না হয় তবে এটি কিছু না প্রিন্ট করুন এবং কলিং শেলটির পরিবর্তে যা করা উচিত তা করতে রিটার্ন কোডটি ব্যবহার করুন।

grep -q -E 'extends[[:space:]]+SomethingSomething' FILENAME ||
echo "$FILENAME"

বিকল্পভাবে, awk ব্যবহার করুন।

awk '
    FNR == 1 && NR != 1 && !found { print fn }
    FNR == 1 { fn = FILENAME; found = 0; }
    /extends[[:space:]]+SomethingSomething/ { found = 1 }
    END { if (fn != "" && !found) print fn }
'

লিনাক্স বা সাইগউইন (বা জিএনইউ গ্রেপ সহ অন্যান্য সিস্টেম) এ, আপনার পুনরুক্তি করতে সক্ষম findহিসাবে ব্যবহার করার দরকার grepনেই।

grep -R --include='*.java' -L -E 'extends[[:space:]]+SomethingSomething'

যদি আপনার শেলটি ksh বা বাশ বা zsh হয় তবে আপনি শেলটি ফাইলের সাথে মিলে ফেলতে পারেন। বাশ এ, set -o globstarপ্রথমে চালান (আপনি এটি আপনার মধ্যে রাখতে পারেন ~/.bashrc)।

grep -L -E 'extends[[:space:]]+SomethingSomething' **/*.java

বাহ এটা আরও ভাল। আমি 'এক্সটেন্ডস (/ গুলি) + সামথিংসামথিং' ব্যবহার করছিলাম যা মনে হচ্ছে যতদূর কাজ করবে। বর্ধিত রেগেক্স সংস্করণে উল্লিখিত একটির সাথে এই সিনট্যাক্সের সাথে কি কোনও পার্থক্য রয়েছে?
হ্যাঞ্জেলো

@ হায়ঞ্জেলো \sএকটি জিএনইউ গ্রেপ এক্সটেনশন, যা আমি মনে করি এর সমার্থক [[:space:]]
গিলস 'অশুভ হওয়া বন্ধ করুন'
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.