꼬리와 grep 반복적으로? grep -rnl

하려고 tail 해커 코드를 검색 할 도메인 목록. 찾고있는 모든 파일이 동일하므로 다음과 같이 시도했습니다.

grep -rnl * -e "Ai9LbaFz7lC13SwzDxAYT72vwA"

파일 이름 / 디렉토리도 보려고합니다.

그러나 전체 파일을 검색하면 CPU 및 시간 낭비가 될 수 있으므로 함께 쓰려고합니다. tail 파일의 작은 부분 만 검색하면됩니다. 이것은 효과가 있었다 :

tail -n10 * | grep --line-buffered -e '^==> .* <==$' -e 'Ai9LbaFz7lC13SwzDxAYT72vwA'

하나 tail 재귀 적으로 보이지 않기 때문에 단지 그 안에있을 것입니다.
나는 누군가가 올바른 방향으로 나를 가리킬 수 있기를 바랍니다.

감사.



답변

tail 명령은 마지막 10 행을 계산하기 위해 전체 파일을 읽어야합니다. 개행 문자를 찾아 행을 결정합니다. 따라서 고정 된 문자열을 찾는 파일을 읽는 중입니다.

반면 grep은 고정 된 문자열을 찾는 전체 파일을 읽고 있습니다. 거의 똑같은 것 같습니다. grep은 다소 복잡하지만 grep은 새로운 프로세스를 포스팅하는 오버 헤드를 걸고 파이프를 설정하는 것이 grep 오버 헤드 이상의 것입니다. 그러나 여러분의 패턴이 정규 표현식이 아닌 고정 된 문자열이라는 것을 알려줌으로써 grep의 속도를 조금 높일 수 있습니다. 그렇게하려면 grep에 “-F”옵션을 지정하십시오 (또는 fgrep을 사용하십시오). GNU grep을 사용하고 있다면 –mmap을 사용하여 작업 속도를 높일 수 있습니다.

주기 grep -rnl * --mmap -F -e "Ai9LbaFz7lC13SwzDxAYT72vwA" 시도해보고 꼬리가 달린 솔루션보다 빠르거나 빠를 지 확인하십시오. 🙂

grep-only 스캔의 정확도는 또 하나의 질문이지만, 여전히 일치가 파일의 마지막 10 행에 있는지 확인하지 못하기 때문입니다. 그러나 나는 그 부분에 대해 일치하는 파일 또는 어떤 것에 줄을 세는 후 처리 명령의 사용을 제안함으로써 그 빛을 보길 원합니다. 😉


답변

세게 때리다:

shopt -s globstar nullglob

for f in **; do
    if [[ -f $f ]] && tail -n 10 "$f" | grep -q --options 'pattern'; then
        echo "$f"
    fi
done


답변