파일에서 문자열의 발생 수를 검색 할 때 일반적으로 다음을 사용합니다.
grep pattern file | wc -l
그러나 grep이 작동하는 방식으로 인해 한 줄에 한 번만 발생합니다. 같은 줄에 있든 다른 줄에 있든 상관없이 문자열이 파일에 나타나는 횟수를 어떻게 검색 할 수 있습니까?
또한 간단한 문자열이 아닌 정규식 패턴을 검색하는 경우 어떻게됩니까? 어떻게 세거나 더 나은 방법으로 각 일치 항목을 새 줄에 인쇄 할 수 있습니까?
답변
모든 발생을 계산하려면을 사용하십시오 -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
출력의 줄 수만 계산합니다.
답변
이 시도:
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]
답변
뒤늦은 게시물 :
검색 정규식 패턴을 레코드 구분 기호 (RS)로 awk
사용하면 정규식이 \n
(필요한 경우) 구분 된 줄 에 걸쳐 있을 수 있습니다.
printf 'X \n moo X\n XX\n' |
awk -vRS='X[^X]*X' 'END{print (NR<2?0:NR-1)}'
답변
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
답변
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