Localizando todos os arquivos contendo uma palavra e depois contando o número de linhas

1

Eu preciso encontrar recursivamente todos os arquivos que contenham uma palavra específica e, se a palavra existir no arquivo, preciso descobrir o número de linhas nesse arquivo. Eu tenho tentado usar grep , mas até agora não obtive sucesso.

    
por user68336 23.05.2014 / 05:19

1 resposta

9

grep -Zlr "\<THE_WORD\>" * | xargs -0 wc -l

Opções para o grep:

  • -Z - encerra nomes de arquivos impressos com um byte zero / nulo para delimitá-los (ajuda com nomes de arquivos estranhos ou com espaços)
  • -l - lista nomes de arquivos, não as linhas que correspondem a
  • -r - recursivamente
  • -i - ignore o caso (opcional, mas provavelmente útil para encontrar TODAS as variantes)

E nas aspas, em torno de THE_WORD , usei 'delimitadores de palavras' ( \< e \> ), que impedem que 'HI' seja encontrado em 'WHICH'. Útil, isso.

Canaliza a lista delimitada de zero de nomes de arquivos contendo "THE_WORD" para xargs , informando que espera delimitadores de zero bytes ( -0 ), executa wc (contagem de palavras), mostrando contagens de linhas ( -l )

EDITAR:

Para responder sua pergunta nos comentários, tente esta variação: (Eu fiz algumas pesquisas!)

grep -oi "\<THE_WORD\>" /dev/null * | sort | uniq -c 

E explicação:

  • -o diz para mostrar TODAS as ocorrências na linha, então se você tiver "blá blá blá blá blá blá blá blá blá blá blá blá blá blá blá blá blá blá blá blá blá blá blá blá blá blá blá blá blá blá blá blá blá" li>
  • -i corresponde ao superior & variações minúsculas (ie, The_Word, the_word, etc)
  • \< deve ser o começo de uma palavra, assim 'HI' NÃO é encontrado em 'WHICH'.
  • '>' deve terminar no final de uma palavra, novamente evitando que 'HI' seja encontrado em 'WHICH'
  • /dev/null um nome de arquivo fictício para forçar o grep a sempre gerar nomes de arquivos, mesmo que você pesquise apenas um arquivo. Isso PODE ser forçado usando a opção -H para o grep, mas acho isso tão fácil e mais descritivo, pois -H poderia ser classificado como 'pouco conhecido-mágico'

  • canaliza tudo isso para ordenar (o que, uh ... ordena ...)

  • canalize a lista classificada para uniq, com -c para contar cada ocorrência na lista classificada

E taadaa !!

Um exemplo:

File example.c contains:

(*H)->segments=realloc((*H)->segments,sizeof(segment_t*)*((*H)->segment_count+1));

xenon-lornix:~/projects/emma> grep -oi "\<H\>" /dev/null *.c | sort | uniq -c
  3 example.c:H

Assim retornando uma lista de uma contagem ( 3 ), onde ( exemplo.c ) e o que ( H ) !! Voila !! Yaaayy !!

Outro, com o mesmo conteúdo do arquivo:

xenon-lornix:~/projects/emma> grep -oi "\<segments\>" /dev/null example.c | sort | uniq -c
  2 aa.c:segments

Você pode ver aqui que encontrou segmentos , mas não contou segmento . O \< & \> force correspondendo apenas palavras inteiras. THE_WORD123 faz NÃO corresponde a _THE_WORD_, as quebras de palavras estão em caracteres não alfanuméricos. FYI.

    
por 23.05.2014 / 05:49