Како да ги броите сите совпаѓања на низа со 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