디렉터리의 일치 항목 수를 계산하고 싶습니다.
grep -rn 'hello' .
줄 번호를 인쇄하고 현재 디렉터리를 재귀적으로 탐색하면서 잘 작동합니다.
grep -rc 'hello' .
반면에 카운트를 반환하지 않고 현재 디렉터리의 모든 파일을 인쇄하는 것 같습니다.
비슷한 것이 있습니다질문과 답변grep -r <pattern> <directory>
이는 to 의 결과를 파이핑하여 이를 수행하는 방법을 보여 주지만 wc -l
위의 명령이 작동하지 않는 이유와 grep 옵션만 사용하여 이를 수행할 수 있는 방법이 있는지 알고 싶습니다.
답변1
이것은 예상됩니다.
grep -r -n
재귀를 수행하여 grep
주어진 패턴과 일치하는 줄을 표시하고 파일 이름과 줄 번호를 앞에 붙입니다. 모든 파일에서 일치하는 모든 줄을 제공합니다.
-n
각 출력 줄 앞에는 줄 1부터 시작하여 파일의 상대 줄 번호가 옵니다. 처리된 각 파일에 대해 줄 번호 카운터가 재설정됩니다.
grep -r -c
재귀가 수행되어 grep
고려된 모든 파일의 파일 이름과 해당 파일의 패턴 일치 수가 표시됩니다. 파일당 한 줄씩 제공됩니다.
-c
선택한 행 수만 표준 출력에 씁니다.
특정 디렉터리에 있는 모든 파일의 패턴과 일치하는 수를 (재귀적으로) 얻으려면 다음 grep -r
과 같이 결과를 제공할 수 있습니다.wc -l
당신이 링크 한 답변에서 제안한대로:
$ grep -r 'pattern' . | wc -l
도착하다만 사용grep
이를 달성하려면:
$ grep -r 'pattern' . | grep -c 'pattern'
wc
정규식 엔진을 사용하여 줄 바꿈을 계산하는 것은 "작업에 적합한 도구"이지만 정규식 엔진을 사용하여 작업을 수행하는 것은 확실히 과잉입니다.
-o
플래그 도 있습니다 grep
.
-o
각 일치 항목을 인쇄하되 전체 줄이 아닌 일치 항목만 인쇄합니다.
이는 각 줄의 개별 일치 항목을 개별적으로 계산하려는 경우 유용할 수 있습니다.
$ grep -r -o 'pattern' . | wc -l
예를 들어 다음 두 grep
호출( bash
또는 ksh93
)을 비교해 보세요.
$ grep 'l' <<<"Hello world!" | wc -l
1
$ grep -o 'l' <<<"Hello world!" | wc -l
3