항목이 파일에 나열된 횟수를 찾을 때 more 또는 find more에 많은 리소스가 필요합니까?

항목이 파일에 나열된 횟수를 찾을 때 more 또는 find more에 많은 리소스가 필요합니까?

나는 최근에 읽었다find 명령을 사용하여 텍스트 및 파일의 총 발생 횟수를 찾는 방법, 파일에서 "abc"라는 텍스트가 나타나는 횟수를 찾는 방법을 묻습니다. 거기에 대한 답변은 find . -name "*.txt" | xargs grep -i "abc" | wc -l개수를 찾는 명령을 제공합니다.

more "file_name*" |grep "abc" |wc -l이전에는 특정 파일에서 "abc"라는 텍스트가 나타나는 횟수를 나열하기 위해 비슷한 접근 방식을 사용했습니다 .

이것을 시도한 결과 more명령이 더 빨리 반환되는 것을 발견했지만 명령보다 약 30% 더 많은 CPU를 사용하는 것 같았습니다(이 역시 를 통해 모니터링했습니다 top) find.

15개 파일에 대해 쿼리하는 경우 이 두 명령 중 어느 명령이 리소스를 더 많이 소모하는지에 대한 좀 더 신뢰할 수 있는 데이터를 갖고 있는 사람이 있는지 궁금합니다. 30개 이상의 파일은 어떻습니까?

답변1

grep해야 하는 파일 목록이 있는 경우에는 필요하지 않습니다 more(또는). 파일을 인수로 제공하기만 하면 됩니다(두 번째 도구를 통해 데이터를 전송할 필요가 없음).catgrep

grep -i abc *.txt | wc -l

주요 차이점은 find현재 디렉토리의 파일을 나열할 뿐만 아니라(쉘 확장으로 *.txt) 하위 디렉토리에도 반복된다는 것입니다.

find . -name "*.txt" | xargs grep -i abc | wc -l

*.txt두 번째 경우, 하위 디렉터리에 일부 파일이 있으면 이 파일도 grep명령에 대한 인수로 제공됩니다.

그건 그렇고, 발생 횟수를 계산하는 옵션이 grep있습니다 (둘 다 필요하지 않음 )-cwc

grep -c -i abc *txt

또한 총 횟수가 아닌 각 파일의 발생 횟수만 제공합니다.

답변2

"하드 데이터"는 없지만 생각해보십시오.

more한 번에 한 화면씩 텍스트의 페이지를 매기는 데 사용되는 (원시) 필터입니다. 이는 "CRT 보기용" 대화형 사용을 위한 것입니다. 따라서 출력을 로 보내더라도 제공된 필터링 기능을 통해 각 파일을 표시하기 위해 pipe여전히 메모리와 CPU 리소스를 사용합니다 .more

cat귀하의 예에서는 대신 사용하는 것이 더 정확합니다 more. 한 단계 더 나아가, 필터 프로그램의 추가 단계를 제거하고 grep파일을 직접 검색함으로써(출력을 파이프로 연결하는 대신) 예제 명령을 더욱 효율적으로 만들 수 있습니다 .

find명령은 속도가 느리기 때문에 현재 작업 디렉토리의 "file_name*"에서 find시작하여 디렉토리 구조를 순회하며 .작동 합니다.more

답변3

언뜻 보면 보상을 받으려는 쓸모없는 시도인 것처럼 보이지만 grep을 호출하기 전에 모든 파일을 분류하면 다음과 같습니다.

cat *.txt | grep -ci abc  

grep이 합계를 계산합니다. 당신은 하위 디렉토리를 반복하는 것을 좋아하므로(그렇지 않습니까?) 하위 디렉토리에서도 이 작업을 수행할 수 있습니다.

find -name "*.txt" -exec cat {} + | grep -ci abc

관련 정보