কোনও ফাইলে প্যাটার্নের সংখ্যার সংখ্যা গণনা করুন (এমনকি একই লাইনেও)


94

কোনও ফাইলে স্ট্রিংয়ের সংখ্যার সন্ধান করার সময়, আমি সাধারণত:

grep pattern file | wc -l

যাইহোক, গ্রেপ যেভাবে কাজ করে তা কেবল এটি প্রতি লাইনে একটি ঘটনা খুঁজে পায়। ফাইলটিতে একই বা ভিন্ন লাইনে থাকা নির্বিশেষে কোনও স্ট্রিংয়ের সংখ্যার জন্য আমি কীভাবে অনুসন্ধান করতে পারি?

এছাড়াও, যদি আমি একটি সাধারণ স্ট্রিং নয়, তবে একটি রেজেক্স প্যাটার্নটি অনুসন্ধান করছি? আমি কীভাবে এগুলি গণনা করতে পারি, বা আরও ভাল, প্রতিটি ম্যাচকে নতুন লাইনে মুদ্রণ করতে পারি?

উত্তর:


157

সমস্ত ঘটনা গণনা করতে, ব্যবহার করুন -o। এটা চেষ্টা কর:

echo afoobarfoobar | grep -o foo | wc -l

এবং man grepঅবশ্যই (:

হালনাগাদ

কিছু ঠিক grep -co fooপরিবর্তে ব্যবহার করার পরামর্শ দেয় grep -o foo | wc -l

না।

এই শর্টকাট সব ক্ষেত্রে কাজ করবে না। ম্যান পেজ বলেছেন:

-c print a count of matching lines

এই পদ্ধতির মধ্যে পার্থক্য নীচে চিত্রিত:

ঘ।

$ echo afoobarfoobar | grep -oc foo
1

ম্যাচটি লাইনে পাওয়া মাত্র ( a{foo}barfoobar) অনুসন্ধান বন্ধ হয়ে যায়। শুধুমাত্র একটি লাইন পরীক্ষা করা হয়েছিল এবং এটি মিলছে, সুতরাং আউটপুট 1। প্রকৃতপক্ষে -oএখানে উপেক্ষা করা হয় এবং আপনি কেবল grep -cপরিবর্তে ব্যবহার করতে পারেন ।

ঘ।

$ echo afoobarfoobar | grep -o foo
foo
foo

$ echo afoobarfoobar | grep -o foo | wc -l
2

দুটি ম্যাচ লাইনটিতে পাওয়া যায় ( a{foo}bar{foo}bar) কারণ আমরা স্পষ্টভাবে প্রতিটি ঘটনা ( -o) খুঁজে পেতে বলেছি । প্রতিটি ঘটনা পৃথক লাইনে মুদ্রিত হয় এবং wc -lআউটপুটে কেবল রেখার সংখ্যা গণনা করে।


4
বাহ ... আসলেই কি এত সহজ?
jrdioko

4
grep -oc এই ক্ষেত্রে কাজ করে না। প্রতিধ্বনির চেষ্টা করুন eoobarfoobar | গ্রেপ-ফোক
পলাস

একাধিক ফাইলের জন্য এটি করার কোনও উপায় নেই? ধরা যাক আমি একটি ফাইলের সেটগুলিতে ফাইল প্রতি ঘটনার সংখ্যা দেখতে চাই। আমি এটি গ্রেপ-সি * দিয়ে প্রতি লাইনে করতে পারি , তবে উদাহরণ হিসাবে নয় not
কিথ টাইলার

grep -o foo a.txt b.txt | sort | uniq -cঠিক কাজ করে (জিএনইউ গ্রেপ
hudolejev

2

এটা চেষ্টা কর:

grep "string to search for" FileNameToSearch | cut -d ":" -f 4 | sort -n | uniq -c

নমুনা:

grep "SMTP connect from unknown" maillog | cut -d ":" -f 4 | sort -n | uniq -c
  6  SMTP connect from unknown [188.190.118.90]
 54  SMTP connect from unknown [62.193.131.114]
  3  SMTP connect from unknown [91.222.51.253]

1

একটি বিচলিত পোস্ট:
অনুসন্ধানের রেজেক্স প্যাটার্নটিকে রেকর্ড বিভাজক (আরএস) হিসাবে ব্যবহার করুন এটি awk
আপনার \nরেজেক্সকে ডিজিটিত রেখাগুলি স্প্যান করতে দেয় (যদি আপনার প্রয়োজন হয়)।

printf 'X \n moo X\n XX\n' | 
   awk -vRS='X[^X]*X' 'END{print (NR<2?0:NR-1)}'

0

রিগ্রগ্রিপ , যা গ্রেপের একটি দ্রুত বিকল্প, সবেমাত্র --count-matchesপতাকাটি প্রবর্তন করেছে প্রতিটি ম্যাচকে ০.৯ সংস্করণে গণনা করার সুযোগ দিচ্ছে (ধারাবাহিকভাবে থাকার জন্য আমি উপরের উদাহরণটি ব্যবহার করছি):

> echo afoobarfoobar | rg --count foo
1
> echo afoobarfoobar | rg --count-matches foo
2

যেমন ওপি দ্বারা জিজ্ঞাসা করা হয়েছে, রিপগ্রিপ রেগেক্স প্যাটার্নটিকেও অনুমতি দেয় ( --regexp <PATTERN>)। এছাড়াও এটি প্রতিটি (লাইন) ম্যাচ পৃথক লাইনে মুদ্রণ করতে পারে:

> echo -e "line1foo\nline2afoobarfoobar" | rg foo
line1foo
line2afoobarfoobar

-1

গ্রেপের রঙ ফাংশন হ্যাক করুন এবং এটিতে কতগুলি রঙ ট্যাগ মুদ্রণ করেছে তা গণনা করুন:

echo -e "a\nb  b b\nc\ndef\nb e brb\nr" \
| GREP_COLOR="033" grep --color=always  b \
| perl -e 'undef $/; $_=<>; s/\n//g; s/\x1b\x5b\x30\x33\x33/\n/g; print $_' \
| wc -l
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.