সাব-ডিরেক্টরি সহ টেক্সট সন্ধান করতে "গ্রেপ" কমান্ডটি কীভাবে ব্যবহার করবেন


373

আমি সমস্ত ফাইল খুঁজে পেতে চাই যাতে পাঠ্যের একটি নির্দিষ্ট স্ট্রিং থাকে। grepকমান্ড কাজ করে, কিন্তু আমি কিভাবে যে ডিরেক্টরির জন্য এটি ব্যবহার করতে (আমি এটা আমার বর্তমান ডিরেক্টরির জন্য শুধুমাত্র করতে পারেন) জানি না। আমি পড়ার চেষ্টা করেছি man grep, তবে তাতে কোনও লাভ হয়নি।


গ্রেপ -আরআইএন <ইওর প্যাটার্ন> * বর্তমান ডিরেক্টরি থেকে সমস্ত পাঠ্য ফাইলে অনুসন্ধান করবে। *।

1
--include="*.C"@ লাইকেনস্টেইনকে ধন্যবাদ @ ব্যবহারকারী311346 বিকল্প সহ ওয়াইল্ডকার্ড ।
বব স্টেইন

বর্তমান এবং সমস্ত উপ ডিরেক্টরিতে স্ট্রিংয়ের জন্য পুনরাবৃত্তভাবে ফাইলগুলি অনুসন্ধান করতে অনুসন্ধান এবং গ্রেপ সংমিশ্রণটি ব্যবহার করুন। এই wilddiary.com/find-files-containing-my-text দেখুন
দ্রোণ

উত্তর:


487

এটি ব্যবহার করা ভাল হবে

grep -rl "string" /path

কোথায়

  • -r(বা --recursive) বিকল্পটি সমস্ত উপ-ডিরেক্টরিকেও অনুসরণ করতে ব্যবহৃত হয় /path, যদিও whereas
  • -l(বা --files-with-matches) বিকল্পটি কেবল মেলানো ফাইলগুলির ফাইলনাম মুদ্রণ করতে ব্যবহৃত হয়, এবং মিলবে না লাইনগুলি (এটি এই গতির উন্নতিও করতে পারে, grepএই বিকল্পটির সাথে প্রথম ম্যাচে কোনও ফাইল পড়া বন্ধ করে দেওয়া হয়েছে )।

13
প্রকৃতপক্ষে যদি "স্ট্রিং" এটি সন্ধানের জন্য একটি পাঠ্য প্যাটার্ন হয় তবে সেই কার্যকারিতাটি ব্যবহার করা আরও ভাল otherwise হিসাবে, হয়। তারপরে আমি "ফিক্সড স্ট্রিং" এর জন্য -rlFসুইচগুলি ব্যবহার করতাম -F(এবং উদাহরণস্বরূপ রিজেক্সএক্স নয়)। অবশ্যই, যদি টাস্কটি রিজেক্সপ ব্যবহার করে তবে আমাকে ক্ষমা করে দিন। অবশ্যই, একই থিওরি -আর ছাড়াও, আমি প্রায়শই দেখি যে লোকেরা গ্রেপ অনুসন্ধানগুলি "পাঠ্য" গ্রহণ করে এবং এটি এমন সমস্যা তৈরি করতে পারে যা বিশেষ কারণে যার অর্থ রেজিপেক্স হিসাবে কিছু বোঝায়।
এলজিবি

4
এছাড়াও -iপতাকা রয়েছে যা কেসকে উপেক্ষা করে।
মার্কো সেপ্পি

3
আমি কেবল --recursiveবিকল্পটি দেখাতে চাইছি , এখানে প্রচুর বিকল্প এবং ব্যবহারের পরিস্থিতি রয়েছে যার বিষয়ে কেউ কথা বলতে পারেন। আমি @ ডমিটিউভ থেকে নেওয়া উত্তরটি গ্রহণ করেছি এবং এটি ছাড়া কাজ করতে সংশোধন করেছি find
এনজোটিব

1
@ এনএন: সম্পন্ন :-)
এনজোটিব

3
@ স্কটবিগস: বিকল্পটি সহ--include '*.h'
এনজোটিব

167

আপনি যদি ফাইলগুলিতে মিলিত লাইনগুলি সন্ধান করেন তবে আমার প্রিয় কমান্ডটি হ'ল:

grep -Hrn 'search term' path/to/files
  • -H ফাইলের নাম মুদ্রণ করে তোলে (একাধিক ফাইল অনুসন্ধান করা হলে বোঝানো হয়)
  • -r পুনরাবৃত্তি অনুসন্ধান করে
  • -n লাইন নম্বরটি মুদ্রণ করে তোলে

path/to/files.বর্তমান ডিরেক্টরিতে অনুসন্ধান করা যেতে পারে

আরও বিকল্প যা আমি খুব দরকারী বলে মনে করি:

  • -Iবাইনারি ফাইলগুলি উপেক্ষা করুন (পরিপূরক: -aসমস্ত ফাইলকে পাঠ্য হিসাবে বিবেচনা করুন)
  • -Fsearch termআক্ষরিক হিসাবে আচরণ করুন , নিয়মিত প্রকাশ নয়
  • -i কেস-সংবেদনশীল অনুসন্ধান করুন
  • --color=alwaysএমনকি যখন পাইপিংয়ের সময় রঙগুলি জোর করে lesslessসমর্থনের রঙগুলি তৈরি করতে , আপনাকে এই -rবিকল্পটি ব্যবহার করতে হবে :

    grep -Hrn search . | less -r
    
  • --exclude-dir=dir.svnএবং যেমন ডিরেক্টরি বাদ দেওয়ার জন্য দরকারী .git

উদাহরণ আউটপুট


13
-Hকোনও ফোল্ডারে অপ্রয়োজনীয়, যদি আরও একটি ফাইল থাকে তবে এটি সম্ভাব্য। প্রকৃতপক্ষে, ম্যান পেজটি বলেছে-H, --with-filename: Print the file name for each match. This is the default when there is more than one file to search.
enzotib

আমি জানতাম না, এটি সর্বদা আমার প্রত্যাশার মতো কাজ করে। ফাইলগুলি অনুসন্ধান করার সময় এটি আমার ডিফল্ট কমান্ড।
লেকেনস্টেইন

1
কেবলমাত্র একটি।
ব্যবহারকারী 2413

6
@ ইউজার 2413 চেষ্টা করুন--include '*.*'
লেকেনস্টেইন

1
@ আল্পার চেষ্টা করুনgrep --exclude='*~' ...
লেকেনস্টেইন

24

আমি বিশ্বাস করি আপনি এরকম কিছু ব্যবহার করতে পারেন:

find /path -type f -exec grep -l "string" {} \;

মন্তব্য থেকে ব্যাখ্যা

findএকটি কমান্ড যা আপনাকে প্রদত্ত পাথের সাব-ডিরেক্টরিতে ফাইল এবং অন্যান্য অবজেক্টের মতো ডিরেক্টরি এবং লিঙ্কগুলি সন্ধান করতে দেয়। যদি আপনি কোনও মাস্ক নির্দিষ্ট না করেন যা ফাইলের নামগুলি পূরণ করতে পারে তবে এটি সমস্ত ডিরেক্টরি অবজেক্টকে গণ্য করে।

  • -type f নির্দিষ্ট করে যে এটি কেবল ফাইলগুলি নয়, ডিরেক্টরি ইত্যাদি প্রক্রিয়াকরণ করবে
  • -exec grepসুনির্দিষ্টভাবে উল্লেখ করা হয় যে প্রতিটি প্রাপ্ত ফাইলের জন্য, এটি গ্রেপ কমান্ডটি {}চালিয়ে তার ফাইলনামটি ফাইলের সাথে প্রতিস্থাপন করে আর্গুমেন্ট হিসাবে যুক্ত করা উচিত

3
যারা জানেন না কেবল তাদের জন্য, -name '*.py''.py' এ শেষ হওয়া ফাইলগুলিতে ম্যাচগুলি সীমাবদ্ধ করে।
ড্যানিয়েল এফ

আমি এটি পছন্দ করি যে এটি তাদের ক্লায়েন্টদের কভার করে যা তাদের গ্রেপ কমান্ডে -আর প্রয়োগ করে না।
অ্যাভিওস

আপনি যদি ম্যাচিং লাইন এবং ফাইলের নাম মুদ্রিত করতে চান তবে এক্সিকিউটটি তৈরি করুন:... -exec bash -c 'grep -r "mystring" {} && echo {}' \;
ডন লি

কেবল গ্রেপ ব্যবহারের সাথে সম্পর্কিত পারফেক্ট কি?
জোনাথন

19

আমার ডিফল্ট আদেশ

grep -Rin string *

আমি একটি ক্যাপিটল 'আর' lsব্যবহার করি কারণ এটি পুনরাবৃত্তির জন্য ব্যবহার করে। যেহেতু গ্রেপ উভয়কেই গ্রহণ করে, তাই এটি ব্যবহার না করার কোনও কারণ নেই।

সম্পাদনা: প্রতি এইচভিএনএসওয়েটিংয়ে দৃশ্যত প্রতীকগুলি -Rঅনুসরণ করবে যেখানে এটি -rহবে না।


1
লুকানো ফাইলগুলিতে অনুসন্ধান করতে, চালান shopt -s dotglob( -s"সেট" হিসাবে মনে রাখবেন )। ফাইলগুলি অপসারণ করার সময় সতর্কতা অবলম্বন করুন। আপনি dotglob সক্রিয় করে থাকেন, তবে rm -r *বর্তমান দির সবকিছু সরিয়ে ফেলা হবে, কিন্তু এছাড়াও ডিরেক্টরির উপরে কারণ ..ম্যাচ। ডটগ্লোব অক্ষম করতে, shopt -u dotglob("আনসেট") ব্যবহার করুন । পরিবর্তনগুলি অস্থায়ী হলেও এটি কেবলমাত্র বর্তমান শেলের জন্য প্রযোজ্য।
লেকেনস্টেইন

আমি এই সম্পর্কে ভুলে গেছি। এটি কি এক লাইনের জন্য সেট করার কোনও উপায় আছে? shopt -s dotglob & <grep cmd> & shopt -y dotglobআরও সুবিধাজনক কিছু ? এইভাবে আমাদের এটি পুনরায় সেট করার বিষয়ে চিন্তা করতে হবে না
ব্যবহারকারী 606723

এছাড়াও, grep -Rin string .এই ক্ষেত্রে বেশিরভাগ ক্ষেত্রে এটি ব্যবহার করা সম্ভবত সহজ । আমি কেবল * ব্যবহার করি কারণ এটি আরও স্বাভাবিকভাবেই আসে বলে মনে হয়।
ব্যবহারকারী 606723

1
যদি আপনি পুনরাবৃত্ত গ্রেপ করেন, তবে আপনি কেবল "" থেকে শুরু করতে পারেন। পরিবর্তে "*". কোন ডটগ্লোব দরকার নেই।
মিশা łরাজের

1
এটিকে ভোট দিন, Rr
ম্যানপেজে

12

আপনি যদি নতুন কিছু চেষ্টা করতে চান তবে ackএকটি শট দিন। এর জন্য বর্তমান ডিরেক্টরিটি পুনরাবৃত্তভাবে অনুসন্ধান করার আদেশটি stringহ'ল:

ack string

ইনস্টলেশন বেশ সহজ:

curl http://betterthangrep.com/ack-standalone > ~/bin/ack && chmod 0755 !#:3

(শর্ত থাকে যে আপনি ইতিমধ্যে ডিরেক্টরিটি পেয়েছেন ~/binএবং এটি সম্ভবত আপনার মধ্যে রয়েছে PATH))


2
অথবা কেবলমাত্র
এসিসি

chmodকমান্ডের শেষ প্যারামিটারগুলি কী করে ? তারা নির্দিষ্ট chmodবা তারা বাশ সম্পর্কিত ( !#:3অংশ)?
এলিয়ট ডারফিংক

@ এলিয়টডারফিংক যা বাশের ইতিহাস বৈশিষ্ট্যটি ব্যবহার করছে - !এটি একটি ইভেন্ট ডিজাইনার । পুনরাবৃত্তি এড়াতে তারা বেশ শক্তিশালী। !#:3এখন পর্যন্ত কমান্ড লাইনের তৃতীয় টোকেনটি উল্লেখ করে, যেমন ~/bin/ackএই ক্ষেত্রে।
কনরাড রুডল্ফ

4

Rgrep কমান্ডটি এই জাতীয় প্রয়োজনের জন্য নিবেদিত

যদি উপলভ্য না হয় তবে আপনি এটি এটি পেতে পারেন

mkdir -p ~/bin
cd ~/bin
wget http://sdjf.esmartdesign.com/files/rgrep
chmod +x rgrep

উপরে বর্ণিত হিসাবে আপনি সরাসরি আপনার ডিফল্ট গ্রেপ বিকল্পগুলিতে সেট করতে পারেন।

আমি ব্যক্তিগতভাবে ব্যবহার

[[  ${#args} -lt 5 && "${args//[[:space:]]/}" == "-i" ]] && args="-Hin"
args="${args:--Hns} --color=auto"

সম্পর্কিত বিষয়: কীভাবে সর্বদা রঙের সাথে rgrep ব্যবহার করবেন


rgrep গ্রেপ প্যাকেজ দ্বারা সরবরাহ করা হয় যা উবুন্টুতে ডিফল্টরূপে ইনস্টল করা হয়।
কারেল

2

আপডেট 2:

কম্যান্ডের এই লাইন ব্যবহার findএবং grepসমস্যা সমাধান করা হয়েছে:

$ find path_to_search_in -type f -exec grep -in searchString {} 2> /dev/null +

--color=<always or auto> রঙিন আউটপুট জন্য:

$ find path_to_search_in -type f \
            -exec grep --color=always -in searchString {} 2>/dev/null +

উদাহরণ:

$ find /tmp/test/ -type f -exec grep --color=auto -in "Search string" {} 2>/dev/null +

নীচে স্ন্যাপশটে চালানো একটি উদাহরণ: snap1


আপডেট 1:

আপনি কোড অনুসরণ করার চেষ্টা করতে পারেন; আপনার .bashrcবা .bash_aliasesকোনও স্ক্রিপ্টে একটি ফাংশন হিসাবে :

wherein () 
{ 
    for i in $(find "$1" -type f 2> /dev/null);
    do
        if grep --color=auto -i "$2" "$i" 2> /dev/null; then
            echo -e "\033[0;32mFound in: $i \033[0m\n";
        fi;
    done
}

ব্যবহার: wherein /path/to/search/in/ searchkeyword

উদাহরণ:

$ wherein ~/Documents/ "hello world"

(দ্রষ্টব্য: @ এঞ্জোটিব নীচের মন্তব্যে যেমন পরামর্শ দিয়েছেন, এটি ফাইল / ডিরেক্টরিতে তাদের নামে ফাঁকা স্থানগুলি সহ কাজ করে না))


আসল পোস্ট

স্ট্রিং এবং আউটপুট অনুসন্ধানের জন্য অনুসন্ধান স্ট্রিংয়ের সাথে কেবল সেই লাইনটি অনুসন্ধান করতে:

$ for i in $(find /path/of/target/directory -type f); do \
    grep -i "the string to look for" "$i"; done

উদাহরণ:

$ for i in $(find /usr/share/applications -type f); \
    do grep -i "web browser" "$i"; done

অনুসন্ধানের স্ট্রিং সহ ফাইলের নাম প্রদর্শন করতে:

$ for i in $(find /path/of/target/directory -type f); do \
    if grep -i "the string to look for" "$i" > /dev/null; then echo "$i"; fi; done;

উদাহরণ:

$ for i in $(find /usr/share/applications -type f); \
    do if grep -i "web browser" "$i" > /dev/null; then echo "$i"; \
    fi; done;

স্পেসযুক্ত ফাইলের নামগুলিতে ব্যর্থ। ব্যর্থতা stderr প্রদর্শিত না হয় যে সত্য দ্বারা আড়াল করা হয়।
এনজোটিব

এটি নির্দেশ করার জন্য @ এঞ্জোটিবকে ধন্যবাদ .. এটি নির্দিষ্ট ফাংশনের জন্য এখনও সমাধান হয়নি .. আমি অন্য একটি লাইনার যদিও যুক্ত করেছি ..
যথাযথ

এখন উত্তর @dmityugov এর অনুরূপ।
enzotib

হ্যাঁ, তবে সেই অর্থে এই পৃষ্ঠায় বেশিরভাগ উত্তর যদি আপনি যা ব্যবহার করেন তেমনি ব্যবহারের ক্ষেত্রে এটি একইরকম হয় তবে এর সাথে grepসাবসেটটি ব্যবহার করা findহয় grep... তবে আপনি যদি পৃথক উত্তর হিসাবে আলাদা আলাদা সুইচ এবং টুইটগুলি গ্রহণ করতে চান, সম্ভবত আমার এখানে খুব ফিট হবে .. বা আপনি পৃথক? সর্বশেষ আপডেটটি আমার অনুসন্ধানে আমি যা চাই তা করতে পারে: অনুসন্ধান কী এবং লাইন নং সহ লাইনগুলির সাথে ফাইল ফাইল করুন। খুব :) এবং আরও ভাল পঠনযোগ্যতার জন্য রঙিন আউটপুট এবং ত্রুটি ফিল্টার ..
যথাযথ

2

grep( জিএনইউ বা বিএসডি )

প্যারামিটারের grepসাহায্যে বর্তমান ফোল্ডারটি পুনরাবৃত্তভাবে অনুসন্ধান করার জন্য আপনি সরঞ্জামটি ব্যবহার করতে পারেন -r:

grep -r "pattern" .

দ্রষ্টব্য: -r- পুনরাবৃত্তভাবে সাব ডিরেক্টরিগুলি অনুসন্ধান করুন।

নির্দিষ্ট ফাইলগুলির মধ্যে অনুসন্ধান করতে আপনি একটি গ্লোবিং সিনট্যাক্স যেমন ব্যবহার করতে পারেন :

grep "class foo" **/*.c

দ্রষ্টব্য: গ্লোব্বিং বিকল্প ( **) ব্যবহার করে , এটি নির্দিষ্ট ফাইল বা প্যাটার্নের সাহায্যে সমস্ত ফাইলকে পুনরাবৃত্তভাবে স্ক্যান করে। এই সিনট্যাক্স সক্ষম করতে, সঞ্চালন করুন: shopt -s globstarআপনি **/*.*সমস্ত ফাইলের জন্যও (লুকানো এবং প্রসার ছাড়াই) বা অন্য কোনও প্যাটার্ন ব্যবহার করতে পারেন ।

যদি আপনার ত্রুটিটি খুব দীর্ঘ হয় তবে আপনার অনুসন্ধানটি সঙ্কুচিত করার বিষয়টি বিবেচনা করুন বা এর findপরিবর্তে বাক্য গঠন ব্যবহার করুন :

find . -name "*.php" -execdir grep -nH --color=auto foo {} ';'

বিকল্পভাবে ব্যবহার ripgrep

ripgrep

আপনি যদি বড় প্রকল্প বা বড় ফাইলগুলিতে কাজ করে থাকেন তবে এর ripgrepপরিবর্তে আপনার ব্যবহার করা উচিত :

rg "pattern" .

গিটহাব প্রকল্প পৃষ্ঠায় ডক্স, ইনস্টলেশন পদক্ষেপ বা উত্স কোড চেকআউট করুন ।

মনে হচ্ছে অন্য কোন টুল তুলনায় অনেক দ্রুততর এর গনুহ / বাসদ grep , ucg, ag, sift, ack, ptবা অনুরূপ, যেহেতু এটি উপরে নির্মিত হয় মরচে এর Regex ইঞ্জিন যা সসীম অটোমাটা, SIMD এবং আক্রমনাত্মক আক্ষরিক অপ্টিমাইজেশন খুব দ্রুত অনুসন্ধানের করতে ব্যবহার করে।

এটি .gitignoreফাইলগুলিতে উল্লিখিত নিদর্শনগুলিকে সমর্থন করে , তাই একক একাধিক গ্লোব নিদর্শনগুলির সাথে একক ফাইলের পাথ মেলাতে পারে।


আপনি সাধারণ পরামিতি যেমন ব্যবহার করতে পারেন:

  • -i - সংবেদনশীল অনুসন্ধান।
  • -I - বাইনারি ফাইল উপেক্ষা করুন।
  • -w - পুরো শব্দগুলির জন্য অনুসন্ধান করুন (আংশিক শব্দের মিলের বিপরীতে)।
  • -n - আপনার ম্যাচের লাইনটি দেখান।
  • -C/ --context(উদাঃ -C5) - প্রসঙ্গ বাড়ায়, তাই আপনি আশেপাশের কোডটি দেখেন।
  • --color=auto - মেলে পাঠ্যটি চিহ্নিত করুন।
  • -H - পাঠ্যটি যেখানে পাওয়া যায় সেখানে ফাইলের নাম প্রদর্শন করে।
  • -c- মিলে যাওয়া লাইনের গণনা প্রদর্শন করে। একত্রিত করা যেতে পারে -H

1

আমি এটি একটি খুব আন্ডাররেটেড কমান্ড xargs ব্যবহার করে করি

find ./ -type f -print0 | xargs -0 grep 'string_you_are_looking_for'

সন্ধান করুন।


4
অপশন এবং বিকল্পের বিকল্প xargsছাড়াই ব্যবহার অবচিত করা হয়, এটি ফাঁকা ফাইল ফাইলগুলিতে ব্যর্থ হবে। -print0find-0xargs
enzotib

@ এনজোটিব আপনার পরামর্শ অনুসারে উত্তরটি সম্পাদনা করেছি - দয়া করে পর্যালোচনা করুন এবং যদি সম্পাদনা ও সংশোধন করা দরকার হয় তবে আমি আপনার দ্বারা পুনরায় সম্পাদনা করতে খুশি হব। তোমাকে ধন্যবাদ
αғsнιη

1
@ ক্যাসিয়াঃ এখন ঠিক আছে, আমার ডাউনটোট সরানো হয়েছে।
enzotib

0

আমি জানি এখানে প্রচুর উত্তর রয়েছে তবে ফাইলগুলি অনুসন্ধান করার সময় আপনি যদি অন্য বিধিনিষেধ যুক্ত করতে চান তবে এখানে একটি বিকল্প রয়েছে:

find . -type f -exec grep --quiet string_to_look_for {} ';' -print

এটি কাজ করে কারণ grepএটির ফলাফল পেলে 0 ফিরে আসবে, অন্যথায় 1। উদাহরণস্বরূপ আপনি ফাইলগুলি 1 এমবি বৃহত্তর এবং কিছু সহ সন্ধান করতে পারেন:

find . -type f -exec grep --quiet string_to_look_for {} ';' -size 1M -print

একাধিক প্রয়োজনীয়তার জন্য আপনি সম্ভবত -Oজিএনইউ গ্রেপে বিদ্যমান অপটিমাইজার পতাকাটি ব্যবহার করতে চান ।


0

সি, সিপিপি কোড অনুসন্ধান করার জন্য একটি স্ক্রিপ্ট (সন্ধানকারী কোড):

#!/bin/sh

find . \( -iname "*.c" -o -iname "*.cpp" -o -iname "*.h" \) -type f -print0 | xargs -0 grep --color -n "$1"

ব্যবহার করুন:

find-in-code "search string"
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.