মিলের লাইনের আগে ফাইলের নাম প্রদর্শন করুন


282

grepএর আউটপুটে মিলের লাইনের আগে আমি ফাইলের নামটি কীভাবে প্রদর্শন করতে পারি ?


2
pls আপনার গ্রেপ সংস্করণটি বলবেgrep --version
ক্যান্ট

3
কেন্ট, grep --versionগ্রেপ সংস্করণটি জানার জন্য কমান্ডটি ব্যবহার করতে হবে? যদি তাই হয়, এটি কাজ করে না। গ্রেপ সংস্করণটি জানার জন্য অন্য কোনও আদেশ খুঁজে পাওয়া যায়নি।
বিবেক

2
ভাল প্রশ্ন তবে 'ওস সংস্করণ' একটি বিভ্রান্তিকর ফাইল ফাইলের নাম
হ্যাগাগুস

1
ওএস ও সংস্করণটি এখানে অপ্রাসঙ্গিক।
এমডি এক্সএফ

উত্তর:


430

grepএকাধিক ফাইলের সাথে এটি আচরণ করে এমন ভাবনা ভাবতে চেষ্টা করার জন্য এই ছোট্ট কৌশলটি চেষ্টা করুন , যাতে এটি ফাইলের নামটি প্রদর্শন করে:

grep 'pattern' file /dev/null

লাইন নম্বর পেতে:

grep -n 'pattern' file /dev/null

6
হ্যাঁ, এটি কাজ করে। আপনি দয়া করে আমাকে /dev/nullএই আদেশে যুক্ত করার তাত্পর্য বলতে পারেন ?
বিবেক

55
যদি grepএকাধিক ফাইলের নাম সরবরাহ করা হয় তবে এটি ম্যাচের আগে ফাইলের নামগুলি স্বয়ংক্রিয়ভাবে প্রদর্শিত হবে, তবে এটি একক ইনপুট ফাইলের ক্ষেত্রে ফাইলের নামটি ছাড়বে। /dev/nullঅতিরিক্ত ইনপুট ফাইল হিসাবে grepএটি "চিন্তা করে" হিসাবে ব্যবহার করে এটি একাধিক ফাইল নিয়ে কাজ করে তবে / ডিভ / নাল অবশ্যই ফাঁকা থাকে, সুতরাং এটি ম্যাচের তালিকায় প্রদর্শিত হবে না ...
স্ক্রুটিনাইজার

32
/ dev / নাল ব্যবহার করা একটি চতুর কৌশল, তবে আমি মনে করি -H পতাকার নীচের পরামর্শটি আরও ভাল উত্তর।
জনকিউ

22
ঠিক আছে, তবে -Hগ্রেপের জন্য বিকল্পটি পসিক্সের অংশ নয়, এবং ব্যবহৃত ওএসটি সোলারিস 10, যেখানে স্ট্যান্ডার্ড গ্রেপ বা গ্রোপের কোনও পসিক্স অনুবর্তী সংস্করণ নেই -H
স্ক্রুটিনাইজার

4
এটি গুরুত্বপূর্ণ যদি আপনি অনুসন্ধানের সাথে গ্রেপ ব্যবহার করছেন, যেমন find . -name foo -exec grep pattern {} \;- fooআপনার উপ-ডিরেক্টরিতে প্রচুর নামযুক্ত ফাইল ধরে নিচ্ছেন, findতখনও grepএকবারে কাজ করার জন্য একটি একক ফাইল হাতে দেয় । /dev/nullকৌতুক সব লিনাক্স / OSX স্বাদে যে আমি চেষ্টা করেছি কাজ বলে মনে হয়, তাই গৌরব! দ্রষ্টব্য আমি মনে করি -Hএটি পরিষ্কার, তবে নীচে উল্লিখিত হিসাবে এটি আপনার সংস্করণে সমর্থিত নাও হতে পারে grep
জন ভি

296

যদি আপনার কাছে বিকল্পগুলি থাকে -Hএবং -nউপলভ্য থাকে (তবে man grepতা আপনার বন্ধু):

$ cat file
foo
bar
foobar

$ grep -H foo file
file:foo
file:foobar

$ grep -Hn foo file
file:1:foo
file:3:foobar

বিকল্প:

-এইচ, - ফাইল-নাম সহ

প্রতিটি ম্যাচের জন্য ফাইলের নাম মুদ্রণ করুন। অনুসন্ধানের জন্য একাধিক ফাইল উপস্থিত থাকলে এটি ডিফল্ট।

-n, - লাইন নম্বর

আউটপুট প্রতিটি লাইন এর ইনপুট ফাইলের মধ্যে 1-ভিত্তিক লাইন নম্বর সঙ্গে উপসর্গ। (-পোসিক্স দ্বারা নির্দিষ্ট করা হয়।)

-Hএকটি গনুহ এক্সটেনশন, কিন্তু -nকরা হয় POSIX দ্বারা নির্দিষ্ট


3
না, -Hএখানে সমর্থিত নয়।
বিবেক

1
সমর্থিত তবে এটি সর্বদা
গ্রেপ

2
উবুন্টু-এইচ এবং -এন উপর কাজ করে। সম্ভবত * নিক্সের সমস্ত নতুন সংস্করণ সহ
tgkprog

1
এই বিকল্পগুলি ছিল না ভেবে সন্ধ্যা না ভেবে আমি কয়েক বছর ধরে তার সাথে লড়াই করেছি!
গ্রিনসাগুয়ারো

45

কোন কৌশল প্রয়োজন।

grep --with-filename 'pattern' file

লাইন নম্বর সহ:

grep -n --with-filename 'pattern' file

3
@ কোডফোরস্টার আমি অন্য কোনও এসকে জানি না grep, তাই আমি জানি না।
MD XF

2
কুল! এই লিনাক্স জন্য কাজ করে। আপনি যদি ম্যাক ব্যবহার করেন তবে মিশ্রণ দিয়ে কোর্টিল ইনস্টল করতে পারেন। এবং মনে রাখবেন PATH = "/ usr / স্থানীয় / অপ্ট / কোর্টিলস / লিবেক্সেক / জেনুবিন: $ PATH" আপনার .bashrc
zw963

2
এটি (এছাড়াও) MinGW (1.0.17, আমি মনে করি) এ কাজ করেছিলেন think
পিটার মর্টেনসেন

এটি বিল্ট-ইন ম্যাক গ্রেপ (২.২.১-ফ্রিবিএসডি) নিয়ে আমার পক্ষে কাজ করে। তবে হোমব্রিউ থেকে বিকল্প গ্রেপ ব্যবহার করার জন্য, অন্য উপায়টি চালানো brew install grepএবং তারপরে কেবল ব্যবহার করা ggrep। PATH পরিবর্তন করার দরকার নেই।
আশ্চর্যজনক

5

এটি সম্পর্কে কীভাবে, যা আমি অংশ পোস্টে ধন্যবাদ অর্জন করতে পেরেছি।

আপনি বেশ কয়েকটি ফাইল সন্ধান করতে চান, বিভিন্ন নামের সাথে লগ বলতে পারি তবে একটি প্যাটার্ন (উদাহরণস্বরূপ filename=logfile.DATE), বেশ কয়েকটি ডিরেক্টরিতে (উদাহরণস্বরূপ ) বিভিন্ন ডিরেক্টরিতে /logsapp1, /logsapp2। প্রতিটি ফাইলের একটি প্যাটার্ন রয়েছে যা আপনি গ্রেপ করতে চান (উদাহরণস্বরূপ "init time"), এবং আপনি "init time"প্রতিটি ফাইলের একটি রাখতে চান তবে এটি কোন ফাইলের সাথে সম্পর্কিত তা জেনে।

find ./logsapp* -name logfile* | xargs -I{} grep "init time" {} \dev\null | tee outputfilename.txt

তারপরে outputfilename.txtএমন কিছু হবে

./logsapp1/logfile.22102015: init time: 10ms
./logsapp1/logfile.21102015: init time: 15ms
./logsapp2/logfile.21102015: init time: 17ms
./logsapp2/logfile.22102015: init time: 11ms

সাধারণভাবে

find ./path_pattern/to_files* -name filename_pattern* | xargs -I{} grep "grep_pattern" {} \dev\null | tee outfilename.txt

ব্যাখ্যা:

find কমান্ডটি প্যাটার্নের ভিত্তিতে ফাইলের নামগুলি অনুসন্ধান করবে

তারপরে পাইপ আউটপুটটিকে ডায়রেক্ট xargs -I{}করবে willfind{}

যা ইনপুট হবে grep ""pattern" {}

তারপরে grepফাইলের নামগুলি প্রদর্শন করার কৌশল\dev\null

এবং শেষ পর্যন্ত, ফাইলের সাথে আউটপুট লিখুন tee outputfile.txt

এটি grep9.0.5 বিল্ড 1989 সংস্করণে আমার জন্য কাজ করেছে ।


3
বা কেবল সন্ধান করুনfind ./path_pattern/to_files -type f -name "files*.log" -exec grep -Hn pattern {} \;
মার্টিন

1

এটি পূর্ববর্তী সমাধান থেকে সামান্য পরিবর্তন। আমার উদাহরণটি ব্যাশ স্ক্রিপ্টগুলিতে স্ট্যাডার পুনঃনির্দেশের সন্ধান করছে: grep '2>' $(find . -name "*.bash")


-7
grep 'search this' *.txt

সমস্ত .txt ফাইল অনুসন্ধান করার জন্য আমার পক্ষে কাজ করেছে (অবশ্যই নিজের অনুসন্ধানের মান লিখুন)।

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