찾기 및 grep에 대한 질문

찾기 및 grep에 대한 질문

나는 수많은 파일과 하위 디렉터리에서 "the"의 모든 발생을 찾아 계산하는 작은 스크립트를 작성 중입니다. 그런 다음 파일 주소와 "the"의 발생 횟수를 인쇄해야 합니다. 그러나 나는 그것을 성취하는 방법을 모른다.

    find . -name "*.txt" -type f -printf "%p\t" -exec grep -c "the" {}\; 

ex.sh 프로그램 이름

txt 파일 확장자

단어 발생 찾기

  • 올바른 출력은 다음과 같아야 합니다.

    ./ex.sh txt the
    
    ./etext00/00ws110.txt 42764
    ./etext00/1cahe10.txt 26692
    ./etext00/1vkip11.txt 21895
    ./etext00/2cahe10.txt 24604
    ./etext00/2yb4m10.txt 15476
    ./etext00/8rbaa10.txt 3131
    
  • 내가 얻는 것:

    ./etext00/00ws110.txt   35388
    ./etext00/1cahe10.txt   17905
    ./etext00/1vkip11.txt   14617
    ./etext00/2cahe10.txt   16971
    ./etext00/2yb4m10.txt   9938
    ./etext00/8rbaa10.txt   1839
    

    나는 그것이 "the"의 모양을 포함하는 행의 수라고 가정하고 있지만 일부 행에는 "the"가 1개 이상 있을 수 있습니다.

답변1

grep -o the생성된 행 수를 사용 하고 계산합니다.

find . -name "*.txt" -type f -printf "%p\t" \
    -exec sh -c 'grep -o "the" "$0" | wc -l' {} \; 

grep -o각 라인의 각 일치 항목을 별도의 라인에 반환합니다(출력 라인당 하나의 일치 항목).

in (전체 단어 일치) 과 같이 일치 항목을 포함(대소문자 구분) 및 제외하기 위해 -wiwith를 사용할 수도 있습니다 .grepThethetheory

답변2

이미 GNU 확장( )을 사용하고 있으므로 -printfGNU의 경우 awk다음을 수행할 수 있습니다.

find . -name '*.txt' -size +2c -readable -type f -exec gawk -v RS=the '
   ENDFILE {print FILENAME "\t" (FNR - ($0 != ""))}' {} +

즉, 레코드 구분자로 사용되며 txt각 파일을 처리한 후 레코드 수를 보고합니다. 그러나 마지막 발생 이후에 나타날 수 있는(그리고 일반적으로 나타나는) 추가 기록은 계산하지 마십시오 txt.

관련 정보