한 줄에 일치 항목이 여러 개 있을 수 있는 경우 grep을 사용하여 일치 항목 수 계산

한 줄에 일치 항목이 여러 개 있을 수 있는 경우 grep을 사용하여 일치 항목 수 계산

의 표준 용도 grep는 패턴과 일치하는 행을 반환하는 것입니다.

행에 패턴 일치 항목이 여러 개 포함될 수 있는 경우 각 일치 항목을 개별적으로 계산하는 방법은 무엇입니까?총 게임 수?

답변1

grep명령에는 -c중요한 옵션이 있습니다패턴 매칭을 통해. 의 표준 사용법은 grep패턴과 일치하는 행을 반환하는 것이므로 "일치 수 계산" 작업을 해결합니다.

행에 패턴 일치 항목이 여러 개 포함될 수 있는 경우 grep각 일치 항목을 개별적으로 계산하려면 비표준 옵션을 사용할 수 있습니다. -o이렇게 하면 각 일치 항목이 자체 라인으로 분리됩니다. 그런 다음 결과를 에 전달하여 일치 항목 수를 계산할 수 있습니다 wc -l. wc대신 실제 계산을 수행 하는 데 사용됩니다 grep. 그러나 속임수를 사용하여 첫 번째 에서 반환된 비어 있지 않은 행의 수를 계산 grep -c .하는 대신 사용할 수 있습니다 . 이것은 약간의 해킹이고 우리가 원하는 것을 정확히 수행하므로 아래 예에서는 이를 사용 하겠습니다 .wc -lgrepwc -lwc

grepwc시스템 설명서를 참조하세요 .

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볼 수 있는 위치입니다 .

관련 정보