आप जीएनयू ग्रेप (हमेशा लिनक्स और Cygwin, कभी कभी कहीं पर) है, तो आप कर सकते हैं से उत्पादन लाइनों गिनतीgrep -o
: grep -o needle | wc -l
।
पर्ल के साथ, यहां कुछ तरीके हैं जो मुझे आपकी तुलना में अधिक सुरुचिपूर्ण लगते हैं (भले ही यह तय हो जाने के बाद )।
perl -lne 'END {print $c} map ++$c, /needle/g'
perl -lne 'END {print $c} $c += s/needle//g'
perl -lne 'END {print $c} ++$c while /needle/g'
केवल पोसिक्स टूल के साथ, एक दृष्टिकोण, यदि संभव हो तो इनपुट को एक मैच के साथ लाइनों में विभाजित करने के लिए इसे grep करने से पहले विभाजित करना है। उदाहरण के लिए, यदि आप पूरे शब्दों की तलाश कर रहे हैं, तो पहले हर गैर-शब्द चरित्र को एक नई पंक्ति में बदल दें।
# equivalent to grep -ow 'needle' | wc -l
tr -c '[:alnum:]' '[\n*]' | grep -c '^needle$'
अन्यथा, टेक्स्ट प्रोसेसिंग के इस विशेष बिट को करने के लिए कोई मानक कमांड नहीं है, इसलिए आपको sed (यदि आप एक मसोकिस्ट हैं) या awk को चालू करने की आवश्यकता है।
awk '{while (match($0, /set/)) {++c; $0=substr($0, RSTART+RLENGTH)}}
END {print c}'
sed -n -e 's/set/\n&\n/g' -e 's/^/\n/' -e 's/$/\n/' \
-e 's/\n[^\n]*\n/\n/g' -e 's/^\n//' -e 's/\n$//' \
-e '/./p' | wc -l
यहाँ का उपयोग कर एक सरल समाधान है sed
और grep
है, जो तार के लिए या नियमित अभिव्यक्ति भी दर-पुस्तक काम करता है लेकिन लंगर पैटर्न के साथ कुछ कोने मामलों में विफल रहता है (के दो घटनाओं यह जैसे पाता है ^needle
या \bneedle
में needleneedle
)।
sed 's/needle/\n&\n/g' | grep -cx 'needle'
ध्यान दें कि ऊपर दिए गए sed प्रतिस्थापन में, मैं \n
एक नई पंक्ति का मतलब करता था। यह पैटर्न भाग में मानक है, लेकिन प्रतिस्थापन पाठ में, पोर्टेबिलिटी के लिए, बैकस्लैश-न्यूलाइन के लिए स्थानापन्न \n
।
grep
है कि निर्दिष्ट है, लेकिन किसी का उपयोग करने के लिएack
, जवाब बस हैack -ch <pattern>
।