일치하는 키워드가 있는 디렉터리의 파일 수를 얻으려고 합니다. 내가 사용하는 코드는 다음과 같습니다
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
첫 번째 디렉터리 앞에 추가하세요.-exec
find
그것이 하는 일은 현재 디렉토리나 다음 디렉토리에 있는 파일 이름 접미사가 있는 모든 파일에서 실행됩니다 grep -q -e 'pattern'
. .sas
일치하는 각 파일에 대해 pattern
출력 x
이 발생합니다 echo x
. echo
그런 다음 이런 방식으로 출력되는 라인 수를 계산하는 데 사용됩니다 wc -l
. 파일 이름에 개행 문자가 포함될 수 있으므로 x
filename 대신 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에 대한 답변이 있습니다.