आप वर्तमान निर्देशिका में सभी फ़ाइलों में किसी पद की प्रत्येक घटना को कैसे गिनेंगे?


10

आप वर्तमान निर्देशिका में सभी फ़ाइलों में किसी पद की प्रत्येक घटना को कैसे गिनेंगे? - और उपनिर्देशिका (?)

मैंने पढ़ा है कि ऐसा करने के लिए आप उपयोग करेंगे grep; सटीक कमांड क्या है?

इसके अलावा, क्या यह कुछ अन्य कमांड के साथ ऊपर संभव है?

जवाबों:


12

grep+ का उपयोग करके wc(यह एक ही पंक्ति पर शब्द के कई आवृत्तियों को पूरा करेगा):

grep -rFo foo | wc -l
  • -rमें grep: वर्तमान निर्देशिका पदानुक्रम में पुनरावर्ती खोज करता है;
  • -Fमें grep: एक पैटर्न के बजाय एक निश्चित स्ट्रिंग के खिलाफ मैच;
  • -oमें grep: प्रिंट केवल मेल खाते हैं;
  • -lमें wc: लाइनों की गिनती प्रिंट;
% tree                 
.
├── dir
│   └── file2
└── file1

1 directory, 2 files
% cat file1 
line1 foo foo
line2 foo
line3 foo
% cat dir/file2 
line1 foo foo
line2 foo
line3 foo
% grep -rFo foo | wc -l
8

मुझे लगता है कि सबसे अच्छा एक।
जैकब व्लिजम

1
@JacobVlijm धन्यवाद! मुझे आपका भी पसंद है (और इसे पहले से ही अपटूडेट किया गया है)
कोस

मुझे लगता है कि PCREsप्रयोग नहीं किया जाना चाहिए क्योंकि वे प्रयोगात्मक हैं
एडवर्ड टॉर्वाल्ड्स

2
PCREs "प्रयोगात्मक" नहीं हैं, लेकिन वे हमेशा grep में संकलित नहीं होते हैं (यही कारण है कि जब मुझे उनकी आवश्यकता होती है तो मैं pcregrep का उपयोग करता हूं)। इस मामले में, वे अनावश्यक हैं, हालांकि, चूंकि सवाल एक "शब्द" के बारे में पूछता है, जो निश्चित रूप से एक निश्चित स्ट्रिंग है, न कि किसी भी तरह का एक पैटर्न। तो, -Fशायद तेज होगा।
dannysauer

2
@dannysauer मैंने PCREs का उपयोग किया क्योंकि कुछ (गलत) कारणों से मुझे लगा कि उन्हें एक ही पंक्ति में कई घटनाओं का मिलान करने की आवश्यकता है, लेकिन वास्तव में वे नहीं हैं। मैं सिर्फ के -Fबजाय का उपयोग करने की कोशिश नहीं की -P। महान सुझाव के लिए धन्यवाद, का उपयोग कर अद्यतन -F, जो वास्तव में यहाँ बेहतर फिट बैठता है।
कोस

8

grep -Rc [term] *वह करेगा। -Rझंडा मतलब है कि आप रिकर्सिवली वर्तमान निर्देशिका और उसकी उप के सभी खोजना चाहते हैं। *सभी फाइलें: एक फ़ाइल चयनकर्ता अर्थ है। -cझंडा बनाता grepउत्पादन केवल घटनाओं की संख्या। हालाँकि, यदि शब्द एक ही पंक्ति में कई बार होता है, तो इसे केवल एक बार गिना जाता है।

से man grep:

  -r, --recursive
          Read all files under each directory, recursively, following symbolic links only if they are on the command line.
          This is equivalent to the -d recurse option.

   -R, --dereference-recursive
          Read all files under each directory, recursively.  Follow all symbolic links, unlike -r.

यदि आपकी निर्देशिका में कोई प्रतीकात्मक लिंक नहीं है, तो कोई अंतर नहीं है।


आप -cध्वज को जोड़ सकते हैं grep। तब grep खुद को गिनता है और आपको wc
Wayne_Yux

--इससे पहले कि आप चाहते हैं*
एडवर्ड Torvalds

2
*केवल गैर-dotfiles का विस्तार होगा, ताकि आप उन सभी याद आती है। यह सिर्फ "का उपयोग करने के लिए अधिक समझ में आता है।" चूँकि आपके पास किसी भी तरह से पुनरावृत्ति की प्रक्रिया चल रही है - और उसे डॉट फाइलें मिलेंगी। यहां बड़ी समस्या यह है कि यह किसी शब्द के होने की संख्या नहीं, बल्कि रेखाओं की संख्या हो सकती है। यदि शब्द एक पंक्ति में कई बार दिखाई देता है, तो इसे केवल एक बार "grep -c" द्वारा गिना जाएगा
dannysauer

2

एक छोटे अजगर लिपि में:

#!/usr/bin/env python3
import os
import sys

s = sys.argv[1]
n = 0
for root, dirs, files in os.walk(os.getcwd()):
    for f in files:
        f = root+"/"+f      
        try:
            n = n + open(f).read().count(s)
        except:
            pass
print(n)
  • इसे इस रूप में सहेजें count_string.py
  • इसे कमांड से डायरेक्टरी से चलाएँ:

    python3 /path/to/count_string.py <term>
    

टिप्पणियाँ

  • यदि शब्द में रिक्त स्थान शामिल हैं, तो उद्धरणों का उपयोग करें।
  • यह शब्द की प्रत्येक घटना को पुनरावर्ती रूप से गिनता है, भले ही एक पंक्ति में कई बार घटित हो।

स्पष्टीकरण:

# get the current working directory
currdir = os.getcwd()
# get the term as argument
s = sys.argv[1]
# count occurrences, set start to 0 
n = 0
# use os.walk() to read recursively
for root, dirs, files in os.walk(currdir):
    for f in files:
        # join the path(s) above the file and the file itself
        f = root+"/"+f
        # try to read the file (will fail if the file is unreadable for some reason)
        try:
            # add the number of found occurrences of <term> in the file
            n = n + open(f).read().count(s)
        except:
            pass
print(n)

2
अजगर लड़का ;) +1
टेलमैहवाई

1
btw क्या rootऔर के fलिए है?
TellMeWhy

1
rootमौजूदा निर्देशिका "ऊपर" सहित फ़ाइल का पथ fहै, फ़ाइल है। वैकल्पिक रूप से, os.path.join()इस्तेमाल किया जा सकता है, लेकिन अधिक क्रिया है।
जेकब वल्जिम 15

1
और n = n + open(f).read().count(s)?
TellMeWhy

2
यह एकमात्र उत्तर प्रतीत होता है, जो ओपी के अनुरोध के अनुसार शब्द की सभी घटनाओं को गिनता है । AFAIK, grep का उपयोग करने वाले सभी समाधान उन सभी लाइनों की गणना करेंगे, जिन पर यह शब्द होता है, इसलिए एक पंक्ति जिसमें तीन बार शब्द शामिल है, केवल एक घटना के रूप में गिना जाएगा।
जो

2

@ कोस के अच्छे उत्तर के एक संस्करण के रूप में, यदि आप कोट्स को आइटम करने में रुचि रखते हैं, तो आप -cघटनाओं को गिनने के लिए grep के स्विच का उपयोग कर सकते हैं :

$ grep -rFoc foo
file1:3
dir/file2:3
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.