গ্রেপ সহ প্রচুর ফাইলগুলিতে স্ট্রিংয়ের সমস্ত উপস্থিতি গণনা করুন


289

আমার কাছে প্রচুর লগ ফাইল রয়েছে have সমস্ত ফাইলগুলিতে কতবার স্ট্রিং হয় তা আমাকে খুঁজে বের করতে হবে।

grep -c string *

আয়

...
file1:1
file2:0
file3:0
...

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

grep -c string * | grep -v :0

...
file4:5
file5:1
file6:2
...

আমি কীভাবে কেবল সংযুক্ত গণনা পেতে পারি? (যদি এটি ফিরে আসে file4:5, file5:1, file6:2, আমি 8 ফিরে পেতে চাই)


1
আপনি কি আমাকে বলতে পারেন গ্রেপ -v: 0 কী করে? । আমি জানি যে এটি 0 এর চেয়ে বেশি সংঘটিত ফাইলগুলির জন্য গণনা করা হয় -v বিকল্পটি এবং: 0 এর অর্থ কী?? অনুগ্রহ করে আমাকে জানতে দাও.
গৌতম হনভনারা

@ গৌতমহোনাভারা গ্রেপ: 0 স্ট্রিংয়ের সাথে মেলে এমন রেখার সন্ধান করছে: 0 -v এই অনুসন্ধানটি উল্টানোর জন্য একটি বিকল্প তাই গ্রেপ ব্যবহার করে -v: 0 এর অর্থ এমন সমস্ত লাইন সন্ধান করুন যা ফাইলটি 4: 5 এবং ফাইল 27: 193 সহ একটি লাইন যেহেতু তাদের ধারণ করে না: 0
পেঙ্গুইন 359

আপনি স্থান ব্যবহার করে একাধিক ফাইল নির্বাচন করতে পারেন। grep file1 file2 --options
জ্ঞানেশ্বর হ্যারে

উত্তর:


288
cat * | grep -c string

9
এটিতে একই সীমাবদ্ধতা রয়েছে যে এটি একবারে একবারে এক লাইনে একাধিক ঘটনা গণনা করে। আমি অনুমান করছি যে এই ক্ষেত্রে এই আচরণটি ঠিক আছে।
মাইকেল হরেন

@ মিশেল হরেন হ্যাঁ, একটি লাইনে কেবল স্ট্রিংয়ের ঘটনা ঘটতে পারে।
jেলজকো ফিলিপিন

2
আমি বরং করতাম grep -c string<*তাই কেবল স্থানটির চেয়ে কম জায়গাগুলি প্রতিস্থাপন করব।
জেমসএম-সাইটজেন

48
এক লাইনে একাধিক ঘটনাকে
সম্বোধন করে না

2
এই যদি আপনি খুব সাবডিরেক্টরি মধ্যে অনুসন্ধান করতে চান কাজ করে না, যেহেতু grep -oএবং wc -lআছে। মূল প্রশ্নের মতো ক্ষেত্রে বিড়ালটি দ্রুততর।
লিগসাইদ গর্ডন

296

এটি প্রতি লাইনে একাধিক সংঘটনগুলির জন্য কাজ করে:

grep -o string * | wc -l

2
এই কাজ করে: grep -o string * --exclude-dir=some/dir/one/ --exclude-dir=some/dir/two | wc -l
একটি কোডার

2
grep -ioR string * | wc -lআমি কেবল কেস-সংবেদনশীল, পুনরাবৃত্তি, মেলানো কেবল অনুসন্ধান করতে যা ব্যবহার করি
লিওনার্ডচ্যালিস

2
এটি একটি সম্পর্কিত ফাইলগুলি এবং তারপরে ম্যাচের মোট গণনা দেখায়:grep -rc test . | awk -F: '$NF > 0 {x+=$NF; $NF=""; print} END{print "Total:",x}'
ইয়ারন

28
grep -oh string * | wc -w

একটি লাইনে একাধিক ঘটনা গণনা করবে


24
grep -oh "... my that curry was strong" * >> wc:)
icc97

23

-C ব্যবহারের পরিবর্তে, কেবল এটি wc -l এ পাইপ করুন।

grep string * | wc -l

এটি প্রতিটি ঘটনাকে একটি লাইনে তালিকাবদ্ধ করবে এবং তারপরে রেখার সংখ্যা গণনা করবে।

যদিও এক লাইনে স্ট্রিংটি 2+ বার ঘটে তবে এর উদাহরণগুলি মিস করবে।


2
"Wc -l" এ পাইপ দেওয়া "গ্রেপ -আর 'পরীক্ষা' এর সাথে একসাথে দুর্দান্তভাবে কাজ করে।" যা বর্তমানের নীচে থাকা সমস্ত ডিরেক্টরিতে 'টেস্ট' স্ট্রিংয়ের জন্য সমস্ত ফাইলকে পুনরাবৃত্তভাবে স্ক্যান করে।
স্টিভেক


9

পূর্ববর্তী সমস্ত উত্তরের চেয়ে আলাদা কিছু:

perl -lne '$count++ for m/<pattern>/g;END{print $count}' *

গ্রেপ ব্যবহার না করে এমন একটি অ্যাপ্রোচ দেখতে পারা ভাল, esp হিসাবে আমার গ্রেপ (উইন্ডোতে) -o বিকল্পটি সমর্থন করে না।
ডেভিড রুসেল

9

আপনি -Rপুনরাবৃত্তভাবে অনুসন্ধানে যুক্ত করতে পারেন (এবং বিড়াল ব্যবহার করা এড়ানো) এবং -Iবাইনারি ফাইলগুলি উপেক্ষা করতে পারেন।

grep -RIc string .

7

বাধ্যতামূলক AWK সমাধান:

grep -c string * | awk 'BEGIN{FS=":"}{x+=$2}END{print x}'

আপনার ফাইলের নামগুলিতে ":" অন্তর্ভুক্ত থাকলে যত্ন নিন।


5

AWK সমাধান যা কলোনাসহ ফাইলের নামগুলিও পরিচালনা করে:

grep -c string * | sed -r 's/^.*://' | awk 'BEGIN{}{x+=$1}END{print x}'

মনে রাখবেন যে এই পদ্ধতিটি এখনও একই লাইনে একাধিক ঘটনা খুঁজে পায় নাstring


4

আপনি যদি ফাইল প্রতি সংঘটন সংখ্যা চান (উদাহরণস্বরূপ "tcp" স্ট্রিং):

grep -RIci "tcp" . | awk -v FS=":" -v OFS="\t" '$2>0 { print $2, $1 }' | sort -hr

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

53  ./HTTPClient/src/HTTPClient.cpp
21  ./WiFi/src/WiFiSTA.cpp
19  ./WiFi/src/ETH.cpp
13  ./WiFi/src/WiFiAP.cpp
4   ./WiFi/src/WiFiClient.cpp
4   ./HTTPClient/src/HTTPClient.h
3   ./WiFi/src/WiFiGeneric.cpp
2   ./WiFi/examples/WiFiClientBasic/WiFiClientBasic.ino
2   ./WiFiClientSecure/src/ssl_client.cpp
1   ./WiFi/src/WiFiServer.cpp

ব্যাখ্যা:

  • grep -RIci NEEDLE . - বর্তমান ডিরেক্টরি থেকে নীড়ল স্ট্রিং অনুসন্ধান করা (নিম্নলিখিত প্রতিলিপিগুলি), বাইনারি উপেক্ষা করে, সংখ্যার সংখ্যা গণনা করা, কেস উপেক্ষা করা
  • awk ... - এই কমান্ডটি শূন্য ঘটনা এবং ফর্ম্যাট লাইনযুক্ত ফাইলগুলিকে উপেক্ষা করে
  • sort -hr - প্রথম কলামে সংখ্যাগুলি দ্বারা বিপরীত ক্রমে লাইনগুলি সাজানো

অবশ্যই এটি অপশন -c(গণনা) সহ অন্যান্য গ্রেপ কমান্ডগুলির সাথেও কাজ করে। উদাহরণ স্বরূপ:

grep -c "tcp" *.txt | awk -v FS=":" -v OFS="\t" '$2>0 { print $2, $1 }' | sort -hr

3

আপনি grepকার্যকরতার সাথে সংখ্যার সংখ্যা ক্যাপচার করতে একটি সাধারণ ব্যবহার করতে পারেন। সঠিকভাবে ক্যাপচার হওয়ার বিষয়টি -iনিশ্চিত করতে আমি বিকল্পটি ব্যবহার করব STRING/StrING/string

কমান্ড লাইন যা ফাইলগুলির নাম দেয়:

grep -oci string * | grep -v :0

কমান্ড লাইন যা ফাইলের নামগুলি মুছে ফেলে এবং ঘটনাগুলি ছাড়াই যদি কোনও ফাইল থাকে তবে 0 মুদ্রণ করে:

grep -ochi string *

আপনি যে উত্তরটি সরবরাহ করেন সে সম্পর্কে আরও কিছু বিবরণ যুক্ত করে আরও উত্তর দিতে পারেন?
অ্যারিসোন

3

সংক্ষিপ্ত পুনরাবৃত্তি বৈকল্পিক:

find . -type f -exec cat {} + | grep -c 'string'

1
ধন্যবাদ! শুধুমাত্র আপনার সমাধানটি আমার পক্ষে কাজ করেছে (সমস্ত ফাইলের মিলগুলির সংক্ষিপ্তসার)।
নেস্টর

1

উইন্ডোগুলির জন্য গ্রেপ দিয়ে পরীক্ষা করেই কেবল সমাধান করতে পারি:

grep -ro "pattern to find in files" "Directory to recursively search" | grep -c "pattern to find in files"

এক লাইনে একাধিক থাকলেও এই সমাধানটি সমস্ত উপস্থিতি গণনা করবে। -rপুনরাবৃত্তভাবে ডিরেক্টরি অনুসন্ধান করে, -o"PATTERN এর সাথে মেলে একটি রেখার অংশটিই দেখায়" - এটি একক লাইনে একাধিক ঘটনা বিভক্ত করে এবং প্রতিটি ম্যাচকে একটি নতুন লাইনে গ্রেপ মুদ্রণ করে; তারপরে -cএকই প্যাটার্নটি ব্যবহার করে সংখ্যার সংখ্যা গণনা করে সেই নতুনলাইন দ্বারা পৃথক-ফলাফলগুলি গ্রেপ-এ ফিরে করুন pipe


1

এখানে একটি দ্রুত-গ্রেপ এডাব্লুকে বিকল্প পদ্ধতি রয়েছে যা <url>কোনও ডিরেক্টরিতে এক্সএমএল ফাইল সংগ্রহের মধ্যে প্রতি লাইন একাধিক ম্যাচ পরিচালনা করে :

awk '/<url>/{m=gsub("<url>","");total+=m}END{print total}' some_directory/*.xml

কিছু এক্সএমএল ফাইলের লাইন ব্রেক নেই এমন ক্ষেত্রে এটি ভাল কাজ করে।


0

বেসিক কমান্ড লাইন ফাংশনগুলি ব্যবহার করে অন্য অনলাইনার প্রতি লাইনে একাধিক ঘটনা পরিচালনা করে।

 cat * |sed s/string/\\\nstring\ /g |grep string |wc -l
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.