Eğer (her zaman başka bir yerde bazen Linux ve Cygwin, üzerine) GNU grep varsa, olabilir çıktı satırları saymakgrep -o
: grep -o needle | wc -l
.
Perl ile, sizinkinden daha şık bulmamın birkaç yolu var ( düzeltildikten sonra bile ).
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'
Yalnızca POSIX araçlarıyla, mümkünse bir yaklaşım grep'e geçmeden önce girişi tek bir eşleşmeyle satırlara bölmektir. Örneğin, tüm kelimeleri arıyorsanız, önce sözcük olmayan her karakteri yeni bir satıra dönüştürün.
# equivalent to grep -ow 'needle' | wc -l
tr -c '[:alnum:]' '[\n*]' | grep -c '^needle$'
Aksi takdirde, bu belirli bir metin işleme bitini yapmak için standart bir komut yoktur, bu yüzden sed (mazoşist iseniz) veya awk'ye dönmeniz gerekir.
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
İşte basit kullanarak çözüm sed
ve grep
düzenli ifadeler dizeleri hatta kitabına göre çalışır ancak (iki oluşumunu örn bulduğu demirlemiş desenleri ile birkaç köşe durumlarda başarısız ^needle
veya \bneedle
içinde needleneedle
).
sed 's/needle/\n&\n/g' | grep -cx 'needle'
Yukarıdaki sed atamalarında, \n
yeni bir satır anlamına geldiğime dikkat edin . Bu, kalıp bölümünde standarttır, ancak yedek metinde, taşınabilirlik için ters eğik çizgi newline yerine kullanılır \n
.
grep
belirtilmiş, ama kullanan herkesack
için cevap basitack -ch <pattern>
.