답변:
grep -o
은 라인을 무시하고 경기 만 출력합니다. wc
그들을 셀 수 있습니다 :
grep -o 'needle' file | wc -l
'니들'또는 '멀티 니들'과도 일치합니다.
한 마디 만 :
grep -o '\bneedle\B' file | wc -l
# or:
grep -o '\<needle\>' file | wc -l
\b
및 \B
여기에서?
uniq
은 인접한 동일한 줄만 제거하므로 중복 항목이 항상 즉시 인접하는지 확실하지 않은 경우 sort
급지하기 전에 공급 해야합니다 uniq
.
당신이 (항상 가끔 다른 곳에서 리눅스와 Cygwin에서에) GNU의 GREP이있는 경우, 당신은 할 수 의 출력 라인을 계산grep -o
: grep -o needle | wc -l
.
Perl을 사용하면 다음보다 더 우아하게 찾을 수있는 몇 가지 방법이 있습니다 ( 고정 된 후에도 ).
perl -lne 'END {print $c} map ++$c, /needle/g'
perl -lne 'END {print $c} $c += s/needle//g'
perl -lne 'END {print $c} ++$c while /needle/g'
POSIX 도구 만 사용하는 경우 가능한 한 방법은 입력을 grep에 전달하기 전에 단일 일치로 입력을 분할하는 것입니다. 예를 들어 전체 단어를 찾으려면 먼저 단어가 아닌 모든 문자를 줄 바꿈으로 바꾸십시오.
# equivalent to grep -ow 'needle' | wc -l
tr -c '[:alnum:]' '[\n*]' | grep -c '^needle$'
그렇지 않으면이 특정 비트의 텍스트 처리를 수행하는 표준 명령이 없으므로 sed (마조히스트 인 경우) 또는 awk로 전환해야합니다.
awk '{while (match($0, /set/)) {++c; $0=substr($0, RSTART+RLENGTH)}}
END {print c}'
sed -n -e 's/set/\n&\n/g' -e 's/^/\n/' -e 's/$/\n/' \
-e 's/\n[^\n]*\n/\n/g' -e 's/^\n//' -e 's/\n$//' \
-e '/./p' | wc -l
다음은 sed
and를 사용하는 더 간단한 솔루션 grep
입니다. 문자열이나 심지어는 정규 표현식에도 작동하지만 앵커 패턴이있는 몇 가지 모퉁이에서는 실패합니다 (예 : ^needle
또는 \bneedle
에서 두 번 발생 needleneedle
).
sed 's/needle/\n&\n/g' | grep -cx 'needle'
위의 sed 대체 \n
에서 줄 바꿈을 의미했습니다. 이것은 패턴 부분의 표준이지만 대체 텍스트에서는 이식성을 위해 backslash-newline을 대체합니다 \n
.
나처럼 실제로 "둘 다; 정확히 한 번" (이것은 실제로 "둘 중 하나")을 원한다면 간단합니다.
grep -E "thing1|thing2" -c
출력을 확인하십시오 2
.
이 방법의 장점은 (정확히 한 번만 경우 입니다 당신이 원하는) 쉽게 확장 할 것입니다.
awk needle
를 필드 분리 자로 사용하는 또 다른 솔루션 :
awk -F'^needle | needle | needle$' '{c+=NF-1}END{print c}'
일치 needle
하고 구두점 을 찾으려면 필드 구분 기호를 적절하게 변경하십시오.
awk -F'^needle[ ,.?]|[ ,.?]needle[ ,.?]|[ ,.?]needle$' '{c+=NF-1}END{print c}'
또는 class : [^[:alnum:]]
를 사용하여 모든 비 알파 문자를 포함하십시오.
귀하의 예제는 파일의 총계가 아닌 한 줄당 발생 횟수 만 인쇄합니다. 이것이 원하는 경우 다음과 같이 작동 할 수 있습니다.
perl -nle '$c+=scalar(()=m/needle/g);END{print $c}'
grep
지정되었지만 알고 있는 사람에게는ack
답은 간단ack -ch <pattern>
합니다.