나는 최근에 읽었다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
(또는). 파일을 인수로 제공하기만 하면 됩니다(두 번째 도구를 통해 데이터를 전송할 필요가 없음).cat
grep
grep -i abc *.txt | wc -l
주요 차이점은 find
현재 디렉토리의 파일을 나열할 뿐만 아니라(쉘 확장으로 *.txt
) 하위 디렉토리에도 반복된다는 것입니다.
find . -name "*.txt" | xargs grep -i abc | wc -l
*.txt
두 번째 경우, 하위 디렉터리에 일부 파일이 있으면 이 파일도 grep
명령에 대한 인수로 제공됩니다.
그건 그렇고, 발생 횟수를 계산하는 옵션이 grep
있습니다 (둘 다 필요하지 않음 )-c
wc
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