Aby policzyć wszystkie wystąpienia, użyj -o
. Spróbuj tego:
echo afoobarfoobar | grep -o foo | wc -l
I man grep
oczywiście (:
Aktualizacja
Niektórzy sugerują użycie po prostu grep -co foo
zamiast grep -o foo | wc -l
.
Nie.
Ten skrót nie będzie działał we wszystkich przypadkach. Strona podręcznika mówi:
-c print a count of matching lines
Różnicę między tymi podejściami przedstawiono poniżej:
1.
$ echo afoobarfoobar | grep -oc foo
1
Po znalezieniu dopasowania w linii ( a{foo}barfoobar
) wyszukiwanie zatrzymuje się. Tylko jedna linia została sprawdzona i pasowała, więc wynik jest 1
. Właściwie -o
jest tutaj ignorowany i możesz po prostu użyć grep -c
zamiast tego.
2.
$ echo afoobarfoobar | grep -o foo
foo
foo
$ echo afoobarfoobar | grep -o foo | wc -l
2
W linii ( a{foo}bar{foo}bar
) znaleziono dwa dopasowania, ponieważ wyraźnie poprosiliśmy o znalezienie każdego wystąpienia ( -o
). Każde wystąpienie jest drukowane w osobnym wierszu i wc -l
zlicza tylko liczbę wierszy w wyniku.
grep -o foo a.txt b.txt | sort | uniq -c
działa dobrze (z GNU grep): gist.github.com/hudolejev/81a05791f38cbacfd4de3ee3b44eb4f8Spróbuj tego:
Próba:
źródło
Spóźniony post:
Użyj wzorca wyszukiwania jako separatora rekordów (RS) w
awk
To pozwala twojemu wyrażeniu regularnemu na
\n
linie z ograniczeniami w zakresie (jeśli tego potrzebujesz).źródło
Ripgrep , który jest szybką alternatywą dla grepa , właśnie wprowadził
--count-matches
flagę umożliwiającą liczenie każdego dopasowania w wersji 0.9 (używam powyższego przykładu, aby zachować spójność):Zgodnie z zapytaniem OP, ripgrep pozwala również na wzorzec wyrażenia regularnego (
--regexp <PATTERN>
). Może również wydrukować każde dopasowanie (wiersz) w osobnym wierszu:źródło
Zhakuj funkcję koloru grepa i policz, ile kolorowych tagów wydrukuje:
źródło