파일에서 패턴의 발생 횟수를 계산합니다 (동일한 줄에서도).


94

파일에서 문자열의 발생 수를 검색 할 때 일반적으로 다음을 사용합니다.

grep pattern file | wc -l

그러나 grep이 작동하는 방식으로 인해 한 줄에 한 번만 발생합니다. 같은 줄에 있든 다른 줄에 있든 상관없이 문자열이 파일에 나타나는 횟수를 어떻게 검색 할 수 있습니까?

또한 간단한 문자열이 아닌 정규식 패턴을 검색하는 경우 어떻게됩니까? 어떻게 세거나 더 나은 방법으로 각 일치 항목을 새 줄에 인쇄 할 수 있습니까?

답변:


157

모든 발생을 계산하려면을 사용하십시오 -o. 이 시도:

echo afoobarfoobar | grep -o foo | wc -l

그리고 man grep물론 (:

최신 정보

일부는 grep -co foo대신 grep -o foo | wc -l.

하지마.

이 단축키는 모든 경우에 작동하지 않습니다. Man 페이지는 다음과 같이 말합니다.

-c print a count of matching lines

이러한 접근 방식의 차이점은 다음과 같습니다.

1.

$ echo afoobarfoobar | grep -oc foo
1

( a{foo}barfoobar) 에서 일치하는 항목이 발견 되면 검색이 중지됩니다. 한 줄만 확인했고 일치 했으므로 출력은 1. 실제로 -o여기에서는 무시되며 grep -c대신 사용할 수 있습니다 .

2.

$ echo afoobarfoobar | grep -o foo
foo
foo

$ echo afoobarfoobar | grep -o foo | wc -l
2

a{foo}bar{foo}bar모든 항목 ( -o) 을 찾기 위해 명시 적으로 요청했기 때문에 행 ( ) 에서 두 개의 일치 항목이 발견되었습니다 . 모든 발생은 별도의 줄에 인쇄되며 wc -l출력의 줄 수만 계산합니다.


1
와 ... 정말 그렇게 간단 해요?
jrdioko

1
이 경우 grep -oc는 작동하지 않습니다. echo afoobarfoobar | 그렙 -OC foo는
폴 러스

여러 파일에 대해이 작업을 수행 할 방법이 없습니까? 파일 집합에서 파일 당 발생 횟수를보고 싶다고 가정 해 보겠습니다. grep -c *로 한 줄에 할 수 있지만 인스턴스 별로 할 수는 없습니다.
Keith Tyler

grep -o foo a.txt b.txt | sort | uniq -c잘 작동합니다 (GNU grep 사용) : gist.github.com/hudolejev/81a05791f38cbacfd4de3ee3b44eb4f8
hudolejev

2

이 시도:

grep "string to search for" FileNameToSearch | cut -d ":" -f 4 | sort -n | uniq -c

견본:

grep "SMTP connect from unknown" maillog | cut -d ":" -f 4 | sort -n | uniq -c
  6  SMTP connect from unknown [188.190.118.90]
 54  SMTP connect from unknown [62.193.131.114]
  3  SMTP connect from unknown [91.222.51.253]

1

뒤늦은 게시물 :
검색 정규식 패턴을 레코드 구분 기호 (RS)로 awk
사용하면 정규식이 \n(필요한 경우) 구분 된 줄 에 걸쳐 있을 수 있습니다.

printf 'X \n moo X\n XX\n' | 
   awk -vRS='X[^X]*X' 'END{print (NR<2?0:NR-1)}'

0

grep의 빠른 대안 인 Ripgrep 은 방금 버전 0.9에서 일치 항목을 --count-matches계산할 수 있는 플래그를 도입했습니다 (일관성을 유지하기 위해 위의 예제를 사용하고 있습니다).

> echo afoobarfoobar | rg --count foo
1
> echo afoobarfoobar | rg --count-matches foo
2

OP의 요청에 따라 ripgrep은 정규식 패턴도 허용합니다 ( --regexp <PATTERN>). 또한 각 (줄) 일치를 별도의 줄에 인쇄 할 수 있습니다.

> echo -e "line1foo\nline2afoobarfoobar" | rg foo
line1foo
line2afoobarfoobar

-1

grep의 색상 기능을 해킹하고 인쇄되는 색상 태그 수를 세십시오.

echo -e "a\nb  b b\nc\ndef\nb e brb\nr" \
| GREP_COLOR="033" grep --color=always  b \
| perl -e 'undef $/; $_=<>; s/\n//g; s/\x1b\x5b\x30\x33\x33/\n/g; print $_' \
| wc -l
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.