grep -rc não funciona; conta o número de correspondências em um diretório

0

Eu quero contar o número de correspondências em um diretório.

grep -rn 'hello' . funciona corretamente, imprimindo números de linha e percorrendo recursivamente o diretório atual.

grep -rc 'hello' . , por outro lado, parece imprimir todos os arquivos no diretório atual sem retornar uma contagem.

Há uma pergunta e resposta semelhante que mostra uma maneira de fazer isso canalizando os resultados de grep -r <pattern> <directory> para wc -l , mas eu estou querendo saber porque meu comando acima não funciona e se há uma maneira de fazer isso usando apenas as opções do grep.

    
por Govind Rai 10.01.2017 / 21:00

1 resposta

0

Isso é esperado.

grep -r -n executará uma grep recursiva, exibindo as linhas que correspondem ao padrão fornecido, prefixadas com o nome do arquivo e o número da linha. Ele fornecerá todas as linhas que tiverem correspondência em cada arquivo.

-n Each output line is preceded by its relative line number in the file, starting at line 1. The line number counter is reset for each file processed.

grep -r -c executará um grep recursivo, exibindo os nomes de arquivos de todos os arquivos considerados, seguido pelo número de correspondências do padrão nesse arquivo. Ele te dará uma linha para cada arquivo.

-c Only a count of selected lines is written to standard output.

Para obter o número de correspondências de um padrão em qualquer arquivo em um diretório específico (recursivamente), você pode fornecer o resultado de grep -r a wc -l como sugerido na resposta que você link para :

$ grep -r 'pattern' . | wc -l

Para usar somente grep para conseguir isso:

$ grep -r 'pattern' . | grep -c 'pattern'

Embora seja certamente um exagero empregar um mecanismo de expressão regular para este trabalho quando usar wc para contar novas linhas é "a ferramenta certa para o trabalho".

Observe que também há o sinal -o to grep :

-o Print each match, but only the match, not the entire line.

Isso pode ser útil se você quiser contar cada correspondência individual em cada linha separadamente:

$ grep -r -o 'pattern' . | wc -l

Compare, por exemplo, as seguintes duas invocações grep (em bash ou ksh93 ):

$ grep 'l' <<<"Hello world!" | wc -l
1

$ grep -o 'l' <<<"Hello world!" | wc -l
3
    
por 29.01.2017 / 20:43

Tags