현재 디렉터리의 모든 파일에서 특정 용어가 나타날 때마다 어떻게 계산합니까?

현재 디렉터리의 모든 파일에서 특정 용어가 나타날 때마다 어떻게 계산합니까?

현재 디렉터리의 모든 파일에서 특정 용어가 나타날 때마다 어떻게 계산합니까? - 그리고 하위 디렉터리(?)

나는 이것을 하기 위해 당신이 사용할 것을 읽었습니다 grep; 정확한 명령이 무엇인가요?

또한 다른 명령으로 위와 같은 작업이 가능합니까?

답변1

grep+ 사용 wc(같은 줄에 용어가 여러 번 나오는 경우를 대비함):

grep -rFo foo | wc -l
  • -rin grep: 현재 디렉터리 계층 구조에서 반복적으로 검색합니다.
  • -Fin grep: 패턴 대신 고정 문자열과 일치합니다.
  • -oin grep: 일치하는 것만 인쇄합니다.
  • -lin wc: 줄 수를 인쇄합니다.
% tree                 
.
├── dir
│   └── file2
└── file1

1 directory, 2 files
% cat file1 
line1 foo foo
line2 foo
line3 foo
% cat dir/file2 
line1 foo foo
line2 foo
line3 foo
% grep -rFo foo | wc -l
8

답변2

grep -Rc [term] *그렇게 할 것입니다. 플래그 -R는 현재 디렉터리와 모든 하위 디렉터리를 재귀적으로 검색한다는 의미입니다. *파일 선택기란 모든 파일을 의미합니다 . 플래그 는 발생 횟수만 출력 -c합니다 . grep그러나 해당 단어가 한 줄에 여러 번 나타나는 경우에는 한 번만 계산됩니다.

에서 man grep:

  -r, --recursive
          Read all files under each directory, recursively, following symbolic links only if they are on the command line.
          This is equivalent to the -d recurse option.

   -R, --dereference-recursive
          Read all files under each directory, recursively.  Follow all symbolic links, unlike -r.

디렉토리에 기호 링크가 없으면 차이가 없습니다.

답변3

작은 Python 스크립트에서:

#!/usr/bin/env python3
import os
import sys

s = sys.argv[1]
n = 0
for root, dirs, files in os.walk(os.getcwd()):
    for f in files:
        f = root+"/"+f      
        try:
            n = n + open(f).read().count(s)
        except:
            pass
print(n)
  • 다른 이름으로 저장하세요 count_string.py.

  • 실행해 보세요디렉토리에서다음 명령으로:

      python3 /path/to/count_string.py <term>
    

노트

  • 용어에 공백이 포함된 경우 따옴표를 사용하세요.
  • 한 줄에 여러 번 나타나는 경우에도 용어의 모든 발생을 재귀적으로 계산합니다.

설명:

# get the current working directory
currdir = os.getcwd()
# get the term as argument
s = sys.argv[1]
# count occurrences, set start to 0 
n = 0
# use os.walk() to read recursively
for root, dirs, files in os.walk(currdir):
    for f in files:
        # join the path(s) above the file and the file itself
        f = root+"/"+f
        # try to read the file (will fail if the file is unreadable for some reason)
        try:
            # add the number of found occurrences of <term> in the file
            n = n + open(f).read().count(s)
        except:
            pass
print(n)

답변4

@kos의 좋은 답변의 변형으로 개수를 항목별로 표시하는 데 관심이 있는 경우 grep의 -c스위치를 사용하여 발생 횟수를 계산할 수 있습니다.

$ grep -rFoc foo
file1:3
dir/file2:3

관련 정보