2015-08-13 10 views
5

के साथ निर्देशिका में मिलान की कुल संख्या की गणना करें मैं एक बड़ी परियोजना में दिए गए स्ट्रिंग के लिए मैचों की संख्या को खोजने का प्रयास कर रहा हूं। वर्तमान में, मैं निम्न आदेश का उपयोग कर रहा ag के साथ ऐसा करना:एजी

$ echo 0$(ag -c searchterm | sed -e "s/^.*:/+/") | bc 

जो स्पष्ट रूप से थोड़ा लंबा और बहुत सहज ज्ञान युक्त नहीं है। ag से निर्देशिका में मिलान की कुल संख्या प्राप्त करने का कोई बेहतर तरीका है? मैंने प्रलेखन के माध्यम से खोद दिया है और वहां कुछ भी उपयोगी नहीं मिला।

संपादित करें: करने के लिए एक recent commitag के लिए धन्यवाद, फ़ाइल नाम sed के बजाय ag साथ छीन लिया जा सकता है, तो यह भी काम करता है:

$ echo `ag test -c --nofilename | sed "s/$/+/"`0 | bc 

नोट: मुझे पता है मैं ack -hcl searchterm के साथ ऐसा कर सकता है (खैर, लगभग मेरे विशिष्ट मामले में मुझे वहां --ignore-dir building की भी आवश्यकता होगी), लेकिन चूंकि यह पहले से ही एक बड़ी परियोजना है (और काफी बढ़ रही है), ag द्वारा प्रस्तावित स्पीड बूस्ट इसे बेहतर बनाता है (ack मेरे लिए लगभग 3 सेकंड लेता है खोज बनाम ag का लगभग तात्कालिक परिणाम), इसलिए मैं चिपकना चाहता हूं इसके साथ के।

+0

आप कभी भी इस प्रश्न का उत्तर मिला: अग्रदर्शी साथ

>$ ag --stats --java -c 'searchstring' | ag '.*matches' >$ 22 matches >$ 6 files contained matches 

फ़िल्टर सिर्फ मैचों की संख्या मुद्रित करने के लिए? – jjaderberg

+0

@jjaderberg बिल्कुल नहीं। सबसे अच्छा विकल्प '--stats' विकल्प लगता है जिसके बाद सही रेखा को पार्स कर दिया जाता है। (उदाहरण के लिए, 'ag --stats searchterm | tail -n 5 | head -n 1')। मैंने '--stats-only' विकल्प के लिए एक पुल अनुरोध भी सबमिट किया जो मुद्रित होने से किसी और चीज को रोकता है, उस स्थिति में 'ag --stats searchterm | हेड-एन 1 'मैचों की संख्या प्राप्त करेगा। उन दोनों मामलों में आपको अभी भी संख्या प्राप्त करने के लिए "मैचों" को फ़िल्टर करने की आवश्यकता होगी। – SnoringFrog

उत्तर

7

मैं आंकड़ों से मेल खाने के लिए स्वयं का उपयोग करता हूं। जैसे:

>$ ag --stats --java -c 'searchstring' | ag -o '^[0-9]+(?=\smatches)' 
>$ 22 
2

फिर भी कोई महान समाधान है, लेकिन यहाँ है कि मैं क्या है जो इस पाता है किसी और के लिए thusfar साथ आने के लिए प्रबंधित किया है: आप फ़ाइलों की भारी मात्रा में खोज नहीं कर रहे हैं, सिर्फ ack -hcl searchterm का उपयोग

, अन्यथा .. ।

मैं --stats विकल्प है, जो खोज परिणामों के लिए निम्न की तरह कुछ जोड़ देती लाभ उठाकर मेरे सवाल में आदेश में सुधार करने में सक्षम है:

714 matches 
130 files contained matches 
300 files searched 
123968435 bytes searched 
0.126203 seconds 

मैनुअल उपयोग के लिए, यह अच्छी बात काफी है (हालांकि यह अभी भी सभी मैचों के साथ स्क्रीन बाढ़ करता है), लेकिन स्क्रिप्ट के लिए मुझे अभी भी केवल संख्या की आवश्यकता है। तो, कि अंत करने के लिए, मैं आदेश से मेरे सवाल में इस के लिए नीचे चले गए हैं:

$ ag --stats searchterm | tail -n5 | head -n1 | cut -d" " -f1 

या अधिक संक्षिप्त लेकिन कम यादगार

$ ag --stats searchterm | tac | awk 'NR==5 {print $1}' 

(tail -r साथ tac की जगह यदि आप डॉन ' टी tac)

थोड़ा और टाइपिंग सहेजने के लिए, मैंने कमांड के उत्तरार्ध को उपनाम दिया ताकि मैं अपने उपनाम में ag --stats पाइप कर सकूं और जो चाहता हूं उसे प्राप्त कर सकूं। तो, alias agmatches='tac | awk "NR==5 {print \$1}' के साथ मैं ag --stats searchterm | agmatches चलाकर केवल मैचों को प्राप्त कर सकता हूं।

अभी भी बेहतर होगा अगर यह कुछ मदद करने के लिए एजी में बनाया गया था। मैंने --stats-only आउटपुट विकल्प के लिए पुल अनुरोध सबमिट किया है जो मदद करेगा, लेकिन अभी तक में से कुछ भी नहीं आया है जो कि यदि आप रेपो से सीधे बनाते हैं, लेकिन अभी तक स्थिर रिलीज में नहीं है, तो इसे तेज करना चाहिए बड़ी संख्या में परिणामों के लिए एक tidbit प्रक्रिया।

संबंधित मुद्दे