Grep के साथ बहुत सारी फ़ाइलों में एक स्ट्रिंग की सभी घटनाओं की गणना करें


289

मेरे पास लॉग फ़ाइलों का एक गुच्छा है। मुझे यह पता लगाने की आवश्यकता है कि सभी फाइलों में कितनी बार एक स्ट्रिंग होती है।

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
क्या आप मुझे बता सकते हैं कि grep -v: 0 क्या करता है? । मुझे पता है कि यह उन फाइलों के लिए गिना जाता है जिनमें 0. से अधिक की घटनाएं होती हैं -v विकल्प और: 0 का मतलब क्या है? कृपया मुझे बताएं।
गौतम होन्नावर

@ गौतमहोनवारा ग्रप: 0 स्ट्रिंग से मेल खाती लाइन के लिए दिखता है: 0। -v एक विकल्प है जो grep का उपयोग करने के बजाय उस खोज को उल्टा करता है -v: 0 का अर्थ है वह सभी पंक्ति जो इसमें शामिल नहीं हैं: 0 तो file4: 5 और file27: 193 के साथ एक पंक्ति तब तक गुजर जाएगी जब तक वे शामिल नहीं होते हैं: 0
पेंगुइन

आप अंतरिक्ष का उपयोग करके कई फ़ाइलों का चयन कर सकते हैं। grep file1 file2 --options
ज्ञानेश्वर हरेर

जवाबों:


288
cat * | grep -c string

9
इसकी एक ही सीमा है कि यह एक ही बार में एक पंक्ति में कई बार घटित होती है। मैं अनुमान लगा रहा हूं कि इस मामले में यह व्यवहार ठीक है, हालांकि।
माइकल हरेन

@ मायकिल हरेन, एक पंक्ति में स्ट्रिंग की केवल एक घटना हो सकती है।
जल्को फिलीपिन

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

-सी का उपयोग करने के बजाय, बस इसे डब्ल्यूसी-एल तक पाइप करें।

grep string * | wc -l

यह एक लाइन पर प्रत्येक घटना को सूचीबद्ध करेगा और फिर लाइनों की संख्या की गणना करेगा।

यह ऐसे उदाहरणों को याद करेगा जहां स्ट्रिंग एक पंक्ति में 2+ बार होती है, हालांकि।


2
"Wc -l" के लिए पाइपिंग "grep -r 'टेस्ट' के साथ अच्छी तरह से मिलकर काम करता है।" जो वर्तमान के नीचे सभी निर्देशिकाओं में स्ट्रिंग 'टेस्ट' के लिए सभी फ़ाइलों को पुन: स्कैन करता है।
15


9

पिछले सभी उत्तरों से कुछ अलग:

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

मेरे grep (विंडोज़ पर) के रूप में grep का उपयोग नहीं करने के लिए एक दृष्टिकोण को देखकर अच्छा है, -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 कमांड के साथ भी काम करता है । उदाहरण के लिए:

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 *

क्या आप अपने समाधान प्रदान करने के बारे में थोड़ा और विवरण जोड़कर अपने जवाब को विस्तृत कर सकते हैं?
अबरिसोन


1

ग्रीप केवल समाधान जो मैंने खिड़कियों के लिए grep के साथ परीक्षण किया:

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

यह समाधान सभी घटनाओं की गणना करेगा भले ही एक पंक्ति में कई हों। -rपुनरावर्ती रूप से निर्देशिका खोजता है, -o"PATTERN से मेल खाते लाइन का केवल एक भाग दिखाएगा" - यह वही है जो एक लाइन पर कई आवृत्तियों को विभाजित करता है और प्रत्येक मैच को एक नई लाइन पर प्रिंट करता है; फिर -cउसी पैटर्न का उपयोग करके घटनाओं की संख्या की गणना करने के लिए उन न्यूलाइन-सेपरेटेड-परिणाम को वापस grep में पाइप करें ।


1

यहां ऐसा करने का एक तेज़-से-संक्षिप्त grep वैकल्पिक तरीका है, जो <url>एक निर्देशिका में XML फ़ाइलों के संग्रह के भीतर, प्रति पंक्ति के कई मैचों को संभालता है :

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

यह उन मामलों में अच्छी तरह से काम करता है जहां कुछ XML फ़ाइलों में लाइन ब्रेक नहीं होते हैं।


0

मूल कमांड लाइन का उपयोग करने वाला एक अन्य ऑन लाइनर प्रति लाइन कई घटनाओं को संभालता है।

 cat * |sed s/string/\\\nstring\ /g |grep string |wc -l
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.