특정 단어가 포함된 모든 파일을 재귀적으로 찾아야 하며, 해당 단어가 파일에 있으면 파일의 줄 수를 알아내야 합니다. 나는 이것을 사용하려고 노력했지만 grep
지금까지 성공하지 못했습니다.
답변1
grep -Zlr "\<THE_WORD\>" * | xargs -0 wc -l
grep 옵션:
-Z
- 인쇄된 파일 이름을 0/null 바이트로 종료하여 구분합니다(이상한 파일 이름이나 공백이 있는 파일 이름에 도움이 됨)-l
- 일치하는 줄 대신 파일 이름 나열-r
- 재귀적으로-i
- 대소문자 무시(선택 사항이지만 모든 변형을 찾는 데 유용할 수 있음)
따옴표 주위에는 "WHICH" 내부에서 "HI"가 발견되는 것을 방지하는 "단어 구분 기호"( 및 )를 THE_WORD
사용했습니다 . 유용해요.\<
\>
"THE_WORD"를 포함하는 0으로 구분된 파일 이름 목록을 에 파이프하고 xargs
, 0바이트 구분 기호를 예상하도록 지시하고( -0
), 실행 wc
(단어 수), 행 수 표시( -l
)
편집하다:
댓글에 있는 질문에 답하려면 다음 변형을 시도해 보세요. (조사를 좀 해봤습니다!)
grep -oi "\<THE_WORD\>" /dev/null * | sort | uniq -c
그리고 설명:
-o
줄에 있는 모든 항목을 인쇄한다는 의미입니다. 따라서 "blah blah THE_WORD blah THE_WORD blah blah"가 있으면 해당 줄에 대해 두 번 인쇄하고, 이 플래그가 없으면 grep은 해당 줄에 대해 한 번만 인쇄합니다.-i
대소문자 변형(예: The_Word, the_word 등)\<
단어의 시작 부분이어야 하므로 "WHICH"에서 "HI"를 찾을 수 없습니다.- `>'는 단어로 끝나야 하며, 'WHICH'에서 'HI'를 찾을 수 없도록 해야 합니다.
/dev/null
단일 파일만 검색하는 경우에도 grep이 항상 파일 이름을 출력하도록 하는 더미 파일 이름입니다. 이것은 grep 옵션을 사용하여 강제할 수 있지만 "잘 알려지지 않은 마법"으로 평가할 수 있을-H
만큼 쉽고 설명이 더 많다는 것을 알았습니다.-H
파이프라인을 통해 모든 것을 정렬합니다(어...정렬...).
정렬된 목록을 uniq로 파이프하고
-c
정렬된 목록의 각 항목 수를 셉니다.
그리고 타다! !
한 가지 예:
File example.c contains:
(*H)->segments=realloc((*H)->segments,sizeof(segment_t*)*((*H)->segment_count+1));
xenon-lornix:~/projects/emma> grep -oi "\<H\>" /dev/null *.c | sort | uniq -c
3 example.c:H
따라서 개수 목록을 반환합니다(삼), 어디(example.c), 그리고 뭐 (시간)! ! 바라보다! 예!
동일한 파일 내용을 가진 또 다른 파일:
xenon-lornix:~/projects/emma> grep -oi "\<segments\>" /dev/null example.c | sort | uniq -c
2 aa.c:segments
여기서 볼 수 있듯이 두 개가 발견되었습니다.부분, 그러나 계산되지 않음부분. \<
& \>
전체 단어만 일치하도록 강제합니다. THE_WORD123
하다아니요단어가 영숫자가 아닌 문자인 경우 _THE_WORD_와 일치합니다. 참고용.