grep을 사용하여 많은 파일에서 문자열을 모두 계산


289

로그 파일이 많이 있습니다. 모든 파일에서 문자열이 몇 번이나 발생하는지 찾아야합니다.

grep -c string *

보고

...
file1:1
file2:0
file3:0
...

파이프를 사용하여 하나 이상의 발생이있는 파일 만 얻을 수있었습니다.

grep -c string * | grep -v :0

...
file4:5
file5:1
file6:2
...

총 개수 만 어떻게 구할 수 있습니까? (이 반환 file4:5, file5:1, file6:2되면 8을 다시 얻고 싶습니다.)


1
grep -v : 0의 기능을 알려주시겠습니까? . 발생 횟수가 0보다 큰 파일을 계산한다는 것을 알고 있습니다. -v 옵션과 : 0의 의미는 무엇입니까? 친절하게 알려주세요.
Gautham Honnavara

@GauthamHonnavara grep : 0은 : 0 문자열과 일치하는 줄을 찾습니다. -v는 검색을 반전시키는 옵션이므로 대신 grep을 사용하면 -v : 0은 : 0을 포함하지 않는 모든 행을 찾아서 file4 : 5 및 file27 : 193을 포함하는 행은 모두 포함하지 않으므로 통과합니다. 0
펭귄 359

공간을 사용하여 여러 파일을 선택할 수 있습니다. grep file1 file2 --options
Dnyaneshwar Harer

답변:


288
cat * | grep -c string

9
한 줄에서 여러 번 발생하는 횟수를 한 번만 계산하는 것과 동일한 제한 사항이 있습니다. 그러나이 경우에는이 동작이 정상이라고 생각합니다.
Michael Haren

@Michael Haren 예, 한 줄에 한 줄만 나타날 수 있습니다.
Željko Filipin

2
차라리 grep -c string<*공간을 적은 것으로 교체하십시오.
JamesM-SiteGen

48
한 줄에 여러 번 언급하지 않는다
블루스 맨

2
이것은 당신이 너무 하위 디렉토리에서 검색 할 경우 작동, 반면하지 않습니다 grep -owc -l않습니다. 고양이는 원래 질문과 같은 경우 더 빠릅니다.
Leagsaidh Gordon

296

한 줄에 여러 번 발생합니다.

grep -o string * | wc -l

2
이것은 또한 작동합니다 : grep -o string * --exclude-dir=some/dir/one/ --exclude-dir=some/dir/two | wc -l.
코더

2
grep -ioR string * | wc -l나는, 재귀, 매칭 전용 검색 대소 문자를 구분을하는 데 사용하는 것입니다
LeonardChallis

2
이 파일은 관련 파일과 총 일치 횟수를 보여줍니다.grep -rc test . | awk -F: '$NF > 0 {x+=$NF; $NF=""; print} END{print "Total:",x}'
Yaron

28
grep -oh string * | wc -w

한 줄에 여러 번 발생


24
grep -oh "... my that curry was strong" * >> wc:)
icc97

23

-c를 사용하는 대신 wc -l로 파이프하십시오.

grep string * | wc -l

그러면 각 행이 단일 행에 나열되고 행 수를 계산합니다.

그러나 문자열이 한 줄에 2 번 이상 발생하는 인스턴스는 누락됩니다.


2
"wc -l"로 파이프하면 "grep -r 'test'와도 잘 작동합니다. 현재 디렉토리 아래의 모든 디렉토리에서 문자열 'test'에 대해 모든 파일을 반복적으로 스캔합니다.
stevek


9

이전의 모든 답변과 다른 점 :

perl -lne '$count++ for m/<pattern>/g;END{print $count}' *

grep을 사용하지 않는 접근법을 보는 것이 좋습니다. 내 grep (Windows의 경우)이 -o 옵션을 지원하지 않기 때문입니다.
David Roussel

9

-R재귀 적으로 검색하고 cat 사용을 피하기 위해 추가 -I하고 이진 파일을 무시할 수 있습니다.

grep -RIc string .

7

필수 AWK 솔루션 :

grep -c string * | awk 'BEGIN{FS=":"}{x+=$2}END{print x}'

파일 이름에 ":"이 포함되어 있는지주의하십시오.


5

콜론을 포함한 파일 이름을 처리하는 AWK 솔루션 :

grep -c string * | sed -r 's/^.*://' | awk 'BEGIN{}{x+=$1}END{print x}'

이 방법은 여전히 같은 줄에서 여러 번 발견 되지 않습니다string .


4

파일 당 발생 횟수를 원하는 경우 (문자열 "tcp"의 예) :

grep -RIci "tcp" . | awk -v FS=":" -v OFS="\t" '$2>0 { print $2, $1 }' | sort -hr

출력 예 :

53  ./HTTPClient/src/HTTPClient.cpp
21  ./WiFi/src/WiFiSTA.cpp
19  ./WiFi/src/ETH.cpp
13  ./WiFi/src/WiFiAP.cpp
4   ./WiFi/src/WiFiClient.cpp
4   ./HTTPClient/src/HTTPClient.h
3   ./WiFi/src/WiFiGeneric.cpp
2   ./WiFi/examples/WiFiClientBasic/WiFiClientBasic.ino
2   ./WiFiClientSecure/src/ssl_client.cpp
1   ./WiFi/src/WiFiServer.cpp

설명:

  • grep -RIci NEEDLE . -현재 디렉토리에서 재귀 적으로 문자열 NEEDLE을 찾습니다 (심볼릭 링크 뒤), 이진 무시, 발생 횟수 계산, 대소 문자 무시
  • awk ... -이 명령은 발생이없는 파일을 무시하고 행을 포맷합니다.
  • sort -hr -첫 번째 열의 숫자를 기준으로 역순으로 줄을 정렬합니다.

물론, 옵션 -c(count)을 가진 다른 grep 명령과도 작동 합니다. 예를 들면 다음과 같습니다.

grep -c "tcp" *.txt | awk -v FS=":" -v OFS="\t" '$2>0 { print $2, $1 }' | sort -hr

3

간단한 grep것을 사용하여 발생 횟수를 효과적으로 캡처 할 수 있습니다. 이 -i옵션을 사용하여 STRING/StrING/string제대로 캡처 되도록 합니다.

파일 이름을 제공하는 명령 줄 :

grep -oci string * | grep -v :0

파일 이름이없는 파일이 있으면 파일 이름을 제거하고 0을 인쇄하는 명령 줄 :

grep -ochi string *

제공하는 솔루션에 대한 설명을 조금 더 추가하여 답변을 더 자세히 설명해 주시겠습니까?
abarisone 2016 년

3

짧은 재귀 변형 :

find . -type f -exec cat {} + | grep -c 'string'

1
감사합니다! 귀하의 솔루션 만 나를 위해 일했습니다 (모든 파일의 일치 항목을 합산).
Nestor

1

Grep을 사용하여 Windows 용으로 테스트 한 Grep only 솔루션 :

grep -ro "pattern to find in files" "Directory to recursively search" | grep -c "pattern to find in files"

이 솔루션은 한 줄에 여러 개가 있어도 모든 발생을 계산합니다. -r디렉토리를 재귀 적으로 검색하여 -o"PATTERN과 일치하는 행의 일부만 표시"-단일 행에서 여러 항목을 분할하고 각 행을 새 행에서 grep 인쇄합니다. 그런 다음 줄 바꿈으로 구분 된 결과를 grep으로 다시 파이프 -c하여 동일한 패턴을 사용하여 발생 횟수를 계산합니다.


1

다음은 <url>디렉토리에있는 XML 파일 모음 내에서 줄당 여러 개의 일치 항목을 처리하는 grep보다 빠른 AWK 대체 방법입니다 .

awk '/<url>/{m=gsub("<url>","");total+=m}END{print total}' some_directory/*.xml

일부 XML 파일에 줄 바꿈이없는 경우에 효과적입니다.


0

한 줄에 여러 번 발생하는 기본 명령 줄 기능을 사용하는 다른 oneliner.

 cat * |sed s/string/\\\nstring\ /g |grep string |wc -l
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.