특정 정규식과 일치하는 모든 파일을 일치 항목 수와 함께 나열합니다.

특정 정규식과 일치하는 모든 파일을 일치 항목 수와 함께 나열합니다.

내용이 특정 정규식과 일치하는 파일을 디렉터리(및 하위 디렉터리)에서 검색하고, 일치하는 각 파일에 대해 해당 파일에서 정규식이 일치하는 횟수를 나열하고 싶습니다.

예를 들어 파일이 다음과 같은 경우

line1
line2
line3
linea
lineb

정규식은 이고 line\d, 첫 번째, 두 번째, 세 번째 줄이 정규식과 일치하므로 번호가 3인 파일을 보고 싶습니다.

이런 일을 하려면 어떻게 해야 합니까?

답변1

패턴과 일치하는 파일을 반복적으로 찾으려면 find PATH -name PATTERN- 을 참조하세요 man find. 검색 방법콘텐츠find병합하려는 grep파일 수 find … -exec grep PATTERN +. 마지막으로 GNU에는 일치 항목 수를 계산하는 / 플래그 grep가 있습니다 .--count-c

$ cd "$(mktemp --directory)"
$ printf '%s\n' foo bar foo > first
$ printf '%s\n' bar foo bar > second
$ printf '%s\n' bar > third
$ find . -name '*r*' -exec grep --count foo {} +
./third:0
./first:2

답변2

스타일 정규식 으로 제한되는 것에 만족 egrep하고 개수가 정규식과 일치하는 줄 수만 계산하는 경우(정규식이 일치하는 총 횟수가 아니라) 다음과 같은 방법이 도움이 될 것입니다.

$ find /directory/name -type f -print | xargs egrep -c "line[0-9]" /dev/null

( /dev/null마지막은 해킹입니다. 출력이 중단되어 xargs실행되는 find마지막 명령이 egrep파일 이름만으로 호출되는 경우입니다. 이 경우 개수가 인쇄되지만 개수가 적용되는 파일 이름은 인쇄되지 않습니다.)

위험하게 살고 싶고 Perl 스타일 정규식을 사용하려는 경우 grep -P대신 을 사용할 수 있지만 egrep실행 중인 시스템에 따라 작동할 수도 있고 작동하지 않을 수도 있습니다.

답변3

사용할 수 있는 재귀 버전입니다 grep. 파일 이름만 원하는 경우 다음을 수행할 수 있습니다.

grep -rl regex *

wc -l위 출력을 보내면 일치하는 파일 수를 얻을 수 있습니다 .

각 파일의 인스턴스 수를 원한다면 시도해 볼 수 있습니다.

grep -rc regex * | grep -v ":0$"

관련 정보