![한 줄에 일치 항목이 여러 개 있을 수 있는 경우 grep을 사용하여 일치 항목 수 계산](https://linux55.com/image/225220/%ED%95%9C%20%EC%A4%84%EC%97%90%20%EC%9D%BC%EC%B9%98%20%ED%95%AD%EB%AA%A9%EC%9D%B4%20%EC%97%AC%EB%9F%AC%20%EA%B0%9C%20%EC%9E%88%EC%9D%84%20%EC%88%98%20%EC%9E%88%EB%8A%94%20%EA%B2%BD%EC%9A%B0%20grep%EC%9D%84%20%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC%20%EC%9D%BC%EC%B9%98%20%ED%95%AD%EB%AA%A9%20%EC%88%98%20%EA%B3%84%EC%82%B0.png)
의 표준 용도 grep
는 패턴과 일치하는 행을 반환하는 것입니다.
행에 패턴 일치 항목이 여러 개 포함될 수 있는 경우 각 일치 항목을 개별적으로 계산하는 방법은 무엇입니까?총 게임 수?
답변1
이 grep
명령에는 -c
중요한 옵션이 있습니다행패턴 매칭을 통해. 의 표준 사용법은 grep
패턴과 일치하는 행을 반환하는 것이므로 "일치 수 계산" 작업을 해결합니다.
행에 패턴 일치 항목이 여러 개 포함될 수 있는 경우 grep
각 일치 항목을 개별적으로 계산하려면 비표준 옵션을 사용할 수 있습니다. -o
이렇게 하면 각 일치 항목이 자체 라인으로 분리됩니다. 그런 다음 결과를 에 전달하여 일치 항목 수를 계산할 수 있습니다 wc -l
. wc
대신 실제 계산을 수행 하는 데 사용됩니다 grep
. 그러나 속임수를 사용하여 첫 번째 에서 반환된 비어 있지 않은 행의 수를 계산 grep -c .
하는 대신 사용할 수 있습니다 . 이것은 약간의 해킹이고 우리가 원하는 것을 정확히 수행하므로 아래 예에서는 이를 사용 하겠습니다 .wc -l
grep
wc -l
wc
grep
wc
시스템 설명서를 참조하세요 .
G
예: 다음의 패턴과 일치하는 행 수 file
:
$ grep -c -e G file
7
예: 동일한 파일의 일치 항목 수이지만 각 일치 항목을 개별적으로 계산합니다.
$ grep -o -e G file | wc -l
18
답변2
사용 awk
:
$ awk '{a += gsub(/pat/,"&"); } END{print a}' file
또는
$ awk '{for(i=1;i<=NF;i++)if ($i ~ /pat/) ++a}END{print a}'
이 명령은 다음에서 가져온 겹침 일치를 약간 변경합니다.이 답변.
$ echo abababa | awk '{ while (a=index($0,"aba")) {++count; $0=substr($0,a+1)}}END{print count}'
답변3
이를 통해 perl
다음을 수행할 수 있습니다.
perl -lsne '$count++ while m{$regex}g; END{print +$count}' -- -regex='perl regex'
이는 빈 일치 항목도 계산할 수 있다는 장점이 있습니다. 예를 들면 다음과 같습니다.
$ seq 10 perl -lsne '$count++ while m{$regex}g; END{print +$count}' -- -regex='\b'
20
(출력 줄 내용의 20 단어 경계 seq 10
).
정규식을 사용하면 perl
미리보기 연산자를 사용하여 특정 중복 일치 사례를 처리할 수도 있습니다.
$ echo abababa | perl -lsne '$count++ while m{$regex}g; END{print +$count}' -- -regex='aba'
2
$ echo abababa | perl -lsne '$count++ while m{$regex}g; END{print +$count}' -- -regex='(?=aba)'
3
일치하는 항목이 발생하는 것이 아니라 aba
일치하는 선 내에서 aba
볼 수 있는 위치입니다 .