Pare o grep depois que os arquivos Nth corresponderem

2

Eu tenho muitos arquivos que eu preciso procurar por alguma string. Estou usando grep -rl 'pattern' * para encontrar arquivos que contenham o padrão. No entanto, estou interessado apenas na contagem de arquivos - se a string ocorre em mais de N arquivos, quero que o grep pare imediatamente após atingir a Nth match (pois pesquisar toda a hierarquia de arquivos é uma operação longa). Seria bom se ele retornasse algum código de saída significativo, mas se isso for impossível, então eu posso canalizá-lo para wc sem nenhum problema.

Como posso dizer ao grep para parar de procurar outros arquivos depois de corresponder ao enésimo arquivo?

    
por MatthewRock 24.08.2015 / 15:08

2 respostas

7

Você pode canalizar o resultado grep para head .

Note que, para garantir a parada após a enésima partida, você precisa usar stdbuf para garantir que grep não armazene em buffer sua saída:

stdbuf -oL grep -rl 'pattern' * | head -n10

Assim que head consumir 10 linhas, ele será encerrado e grep receberá SIGPIPE , pois ainda produzirá algo para enviar enquanto head desapareceu.

Isso pressupõe que nenhum nome de arquivo contém nova linha.

    
por 24.08.2015 / 15:22
0

Não é puro grep , mas com bash :

i=0
grep -rl 'pattern' * | while read l ; do
  i=$(($i+1))
  echo $l
  if [ $i -ge N ] ; then 
    echo "at least N matches"
    break
  fi
done

Será mais rápido se você tiver muito mais arquivos correspondentes ao seu limite de N .

    
por 24.08.2015 / 15:22

Tags