Answers:
-oරේඛා නොසලකා හරිමින් grep ගේ ප්රති match ල පමණක් ප්රතිදානය කරයි; wcඒවා ගණන් කළ හැකිය:
grep -o 'needle' file | wc -l
මෙය 'ඉඳිකටු' හෝ 'බහුකාර්යයට' ගැලපේ.
තනි වචන පමණක් ගැලපීමට පහත විධානයන්ගෙන් එකක් භාවිතා කරන්න:
grep -ow 'needle' file | wc -l
grep -o '\bneedle\b' file | wc -l
grep -o '\<needle\>' file | wc -l
\bසහ \Bකරන්නේ කුමක්ද?
uniqඉවත් කරන්නේ යාබද සමාන රේඛා පමණි, අනුපිටපත් සෑම විටම වහාම යාබදව ඇති බව ඔබට දැනටමත් විශ්වාස නැතිනම් sortපෝෂණය කිරීමට පෙර අවශ්ය වේ uniq.
ඔබට GNU grep තිබේ නම් (සෑම විටම ලිනක්ස් සහ සිග්වින් මත, ඉඳහිට වෙනත් තැනක), ඔබට ප්රතිදාන රේඛා ගණනය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'
POSIX මෙවලම් සමඟ පමණක්, එක් ප්රවේශයක් නම්, හැකි නම්, ආදානය grep වෙත යැවීමට පෙර තනි ගැලපීමක් සමඟ පේළි වලට බෙදීමයි. උදාහරණයක් ලෙස, ඔබ සම්පූර්ණ වචන සොයන්නේ නම්, පළමුව සෑම වචන නොවන අක්ෂරයක්ම නව රේඛාවක් බවට පත් කරන්න.
# equivalent to grep -ow 'needle' | wc -l
tr -c '[:alnum:]' '[\n*]' | grep -c '^needle$'
එසේ නොමැතිනම්, මෙම විශේෂිත පෙළ සැකසීම සඳහා සම්මත විධානයක් නොමැත, එබැවින් ඔබ sed (ඔබ මැසොචිස්ට්වාදියෙකු නම්) හෝ අවදි විය යුතුය.
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'
ඉහත සඳහන් කළ ආදේශකවලදී, මම \nනව රේඛාවක් අදහස් කළ බව සලකන්න . මෙය රටා කොටසෙහි සම්මත වේ, නමුත් ආදේශන පා text යේ, අතේ ගෙන යා හැකි බව සඳහා, බැක්ස්ලෑෂ්-නව රේඛාව ආදේශ කරන්න \n.
මා මෙන්, ඔබට සැබවින්ම අවශ්ය වූයේ "දෙකම; එක් එක් හරියටම", (මෙය ඇත්ත වශයෙන්ම "එක්කෝ; දෙවරක්") එවිට එය සරල ය:
grep -E "thing1|thing2" -c
ප්රතිදානය සඳහා පරීක්ෂා කරන්න 2.
මෙම ප්රවේශය යහපත (හරියටම වරක් නම් වේ ඔබට අවශ්ය දේ) එය පහසුවෙන් ජල ද්රෝණි බව ය.
needleක්ෂේත්ර හා බෙදුම්කරු ලෙස භාවිතා කරන තවත් විසඳුමක් :
awk -F'^needle | needle | needle$' '{c+=NF-1}END{print c}'
needleවිරාම ලකුණු කිරීමෙන් පසුව ඔබට ගැලපීමට අවශ්ය නම් , ඒ අනුව ක්ෂේත්ර බෙදුම්කරු වෙනස් කරන්න
awk -F'^needle[ ,.?]|[ ,.?]needle[ ,.?]|[ ,.?]needle$' '{c+=NF-1}END{print c}'
නැතහොත් පංතිය භාවිතා කරන්න: [^[:alnum:]]සියලුම ඇල්ෆා නොවන අක්ෂර ඇතුළත් කිරීමට.
ඔබේ උදාහරණයෙන් මුද්රණය වන්නේ එක් පේළියකට සිදුවීම් ගණන මිස ගොනුවේ ඇති මුළු ගණන නොවේ. එය ඔබට අවශ්ය නම්, මේ වගේ දෙයක් ක්රියාත්මක විය හැකිය:
perl -nle '$c+=scalar(()=m/needle/g);END{print $c}'
grepනිශ්චිතව දක්වා ඇති බව මම දනිමි , නමුත් භාවිතා කරන ඕනෑම කෙනෙකුටackපිළිතුර සරලවමack -ch <pattern>වේ.