grep을 사용하여 키워드가 존재하는 파일 수를 가져옵니다. [닫기]

grep을 사용하여 키워드가 존재하는 파일 수를 가져옵니다. [닫기]

일치하는 키워드가 있는 디렉터리의 파일 수를 얻으려고 합니다. 내가 사용하는 코드는 다음과 같습니다

grep -r -i --include=*.sas 'keyword'- 총 키워드 수를 알려줍니다.

grep -l "keyword" --include="*.sas" * | wc -l- 이 코드는 작동하지 않습니다.

누구든지 키워드가 포함된 파일 수를 얻는 방법을 도와줄 수 있습니까?

답변1

find개인적으로 나는 계산을 위해 and 를 함께 사용하겠습니다 grep.

find . -type f -name '*.sas' -exec grep -q -e 'pattern' {} \; -exec echo x \; |
wc -l

하위 디렉터리로 재귀적으로 이동하지 않으려면 -maxdepth 1첫 번째 디렉터리 앞에 추가하세요.-execfind

그것이 하는 일은 현재 디렉토리나 다음 디렉토리에 있는 파일 이름 접미사가 있는 모든 파일에서 실행됩니다 grep -q -e 'pattern'. .sas일치하는 각 파일에 대해 pattern출력 x이 발생합니다 echo x. echo그런 다음 이런 방식으로 출력되는 라인 수를 계산하는 데 사용됩니다 wc -l. 파일 이름에 개행 문자가 포함될 수 있으므로 xfilename 대신 es를 평가합니다 .wc

비재귀 변형의 경우 간단한 셸 루프를 선택할 수도 있습니다.

for name in ./*.sas; do
    [ ! -f "$name" ] && continue
    grep -q -e 'pattern' "$name" && echo x
done | wc -l

또는,

n=0
for name in ./*.sas; do
    [ ! -f "$name" ] && continue
    grep -q -e 'pattern' "$name" && n=$((n + 1))
done
echo "$n"

pattern정규식이 아니라 문자열인 경우 대신 이를 사용하세요 grep -q -F -e 'string'.

답변2

find $DIR  -type f  -name '*.sas'  -exec grep -m1 -e 'pattern' {} \; | wc -l

-m1 옵션을 사용하면 grep파일당 최대 1줄을 출력하여 wc -l패턴이 포함된 올바른 파일 수를 제공합니다.

답변3

grep -rl --include='*.sas' keyword . | wc -l

파일 경로에 개행 문자가 포함되어 있지 않으면 작동합니다.

이를 사용하려면 행 대신 NUL로 구분된 레코드로 전환해야 합니다.

grep -rlZ --include='*.sas' keyword . | tr -cd '\0' | wc -c

( / 는 비표준 확장자 -r이며 로케일(예: UTF-8 로케일)에서 유효한 문자를 형성하지 않는 바이트 시퀀스가 ​​포함된 파일 이름과 일치할 수 없습니다.-Z--include*.sas$'st\xe9phane.sas'

답변4

\grep -rh -i -m1 --include='*.sas' -e 'pattern' |wc -l

-h: 파일 이름을 출력하지 않습니다. 개행 문자가 포함된 파일/경로에서는 중단되지 않습니다.
-m1: 첫 번째 일치 항목이 발견되면 파일의 나머지 부분 읽기를 중지합니다
-r. : 재귀
-i: 대소문자를 구분하지 않는 일치
-e: PATTERN을 다음과 같이 사용합니다.무늬; -패턴 시작 부분에 나타나는 경우 grep 스위치 식별자로 처리하지 마십시오.


man grep또한 다음 에서 보거나 스크롤하는 대신 알고 싶은 각 스위치를 빠르게 살펴보고 사용하는 데 유용할 것이라고 생각한 AU에 대한 답변이 있습니다.

관련 정보