Cauda e grep recursivamente?

1

Tentando tail através de uma lista de domínios para pesquisar um código de hacker. Todos os arquivos que estou procurando são os mesmos, então eu estava tentando algo assim:

grep -rnl * -e "Ai9LbaFz7lC13SwzDxAYT72vwA"

Tentando ver o nome / diretório do arquivo também.

No entanto, ele pesquisa o arquivo inteiro e isso pode ser um desperdício de tempo e CPU, portanto, tentar escrevê-lo com tail , já que estou precisando apenas pesquisar uma pequena seção do arquivo. Isso funcionou:

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

No entanto, tail não parece ser recursivo, portanto, ele permanecerá apenas dentro dele. Eu definitivamente não sou mestre em código, então espero que alguém me aponte na direção certa.

Obrigado.

    
por Josh Henry 18.02.2014 / 22:49

2 respostas

2

O comando tail tem que ler o arquivo inteiro para calcular as últimas dez linhas. Ele determina linhas procurando por caracteres de nova linha. Então, está lendo o arquivo procurando por strings fixas.

Seu grep, por outro lado, está lendo todo o arquivo procurando por uma string fixa. Parece quase a mesma coisa. Concedido, o grep é um pouco mais complexo, mas eu aposto a sobrecarga de bifurcar um novo processo e configurar os pipes é mais do que a sobrecarga do grep. Você pode, no entanto, acelerar um pouco o grep dizendo que seu padrão é uma string fixa em vez de um regexp. Para fazer isso, especifique a opção "-F" para grep (ou use fgrep). Se você tem o GNU grep, você provavelmente também pode usar o --mmap para acelerar as coisas.

Dê uma chance a grep -rnl * --mmap -F -e "Ai9LbaFz7lC13SwzDxAYT72vwA" e veja se ela é tão rápida ou mais rápida do que a sua solução com a cauda. :)

A precisão da varredura somente do grep é outra questão, no entanto, já que isso ainda não está validando que a correspondência está nas últimas 10 linhas do arquivo. Mas eu espero encobrir essa parte sugerindo o uso de um comando de pós-processamento para contar as linhas em arquivos correspondentes ou algo assim. ;)

    
por 19.02.2014 / 23:45
1

bash:

shopt -s globstar nullglob

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