Како да ги броите сите совпаѓања на низа со grep за Linux
grep
е алатка за пребарување текст што може да работи со стандарден влез или повеќе датотеки одеднаш. Се користи за печатење на совпаѓања за обрасци, жици или регуларни изрази. Често е корисно да може да се брои бројот на совпаѓања, што grep
може да го направи прилично лесно.
Броење натпревари со grep
Наредбата grep
го има ознаката -c
, што ќе го брои бројот на совпаднати линии и ќе испечати број. Ова е корисно за многу работи, како што е пребарување низ датотеките за евиденција за бројот на записи од IP на честички, крајна точка или друг идентификатор.
grep -c "1.2.3.4" /var/log/nginx/access.log
Сепак, grep
може да се совпадне повеќе пати по линија. Ако го користите ознаката -o
, grep
ќе испечати нова линија по натпревар. Ова не функционира со знамето -c
, бидејќи ќе ги брои само соодветните линии, а не повеќе совпаѓања по линија.
Подобро решение е да се користи алатката wc
(број на зборови) со параметарот -l
(линии), кој ќе го брои необработениот број на линиите му се пренесуваат преку стандарден влез. Користењето на wc -l
е претпочитаното решение бидејќи работи со -o
за броење на бројот на појавувања на дадената низа или шема низ целата датотека.
grep -o "foo" file | wc -l
Броење низ повеќе датотеки
Добра карактеристика на grep
е способноста да се ракува со повеќе датотеки одеднаш, или поминати низ xargs
, параметри или обезбедени со проширување на џокерите. Кога ракувате со повеќе датотеки, grep
ќе го испечати името на датотеката пред да се совпадне. Кога се користи -c
за броење на бројот на линии што се совпаѓаат, ќе ги отпечати и имињата на датотеките:
grep "foo" ./*.txt -cH
Секогаш треба да го користите ознаката -H
кога работите со можност за повеќе датотеки, бидејќи тоа секогаш ќе го печати името на датотеката дури и ако има само една датотека предадена на grep
. Ова ќе го спречи прекинувањето на автоматизацијата ако зависите од тоа што името на датотеката е таму.
Ако сакате да користите -o
за да броите повеќе совпаѓања по линија и да го пренесете излезот на wc -l
, за жал, ќе имате можност да ги видите броевите за секоја поединечна датотека како со -c
. Сепак, со малку скриптирање, можете да ја исечете првата колона со cut
и да го броите бројот на единствени појави за секое име на датотека со uniq -c
:
grep "foo" ./*.txt -o | cut -d ':' -f 1 | uniq -c