Eu tenho um monte de arquivos de log. Preciso descobrir quantas vezes uma string ocorre em todos os arquivos.
grep -c string *
retorna
...
file1:1
file2:0
file3:0
...
Usando um pipe, consegui obter apenas arquivos com uma ou mais ocorrências:
grep -c string * | grep -v :0
...
file4:5
file5:1
file6:2
...
Como posso obter apenas a contagem combinada? (Se retornar file4:5, file5:1, file6:2
, eu quero voltar 8.)
grep file1 file2 --options
Respostas:
fonte
grep -c string<*
Apenas substituindo o espaço por um menor que.grep -o
ewc -l
faz. gato é mais rápido em casos como a pergunta original.Isso funciona para várias ocorrências por linha:
fonte
grep -o string * --exclude-dir=some/dir/one/ --exclude-dir=some/dir/two | wc -l
.grep -ioR string * | wc -l
é o que eu uso para fazer um case-insensitive, recursivo, correspondência somente procurargrep -rc test . | awk -F: '$NF > 0 {x+=$NF; $NF=""; print} END{print "Total:",x}'
contará várias ocorrências em uma linha
fonte
grep -oh "... my that curry was strong" * >> wc
:)Em vez de usar -c, basta canalizá-lo para wc -l.
Isso listará cada ocorrência em uma única linha e depois contará o número de linhas.
Porém, isso ocorrerá nos casos em que a sequência ocorrer mais de 2 vezes em uma linha.
fonte
Uma das raras aplicações úteis de
cat
.fonte
Algo diferente de todas as respostas anteriores:
fonte
Você pode adicionar
-R
à pesquisa recursivamente (e evitar o uso de cat) e-I
ignorar arquivos binários.fonte
Solução AWK obrigatória:
Tome cuidado se os nomes dos arquivos incluírem ":".
fonte
A solução AWK, que também lida com nomes de arquivos, incluindo dois pontos:
Lembre-se de que esse método ainda não encontra várias ocorrências
string
na mesma linha.fonte
Se você deseja um número de ocorrências por arquivo (exemplo para a sequência "tcp"):
Exemplo de saída:
Explicação:
grep -RIci NEEDLE .
- procura a string NEEDLE recursivamente no diretório atual (seguindo links simbólicos), ignorando binários, contando o número de ocorrências, ignorando maiúsculas e minúsculasawk ...
- este comando ignora arquivos com zero ocorrências e formata linhassort -hr
- classifica as linhas na ordem inversa por números na primeira colunaObviamente, ele funciona com outros comandos grep com a opção
-c
(count) também. Por exemplo:fonte
Você pode usar um simples
grep
para capturar efetivamente o número de ocorrências. Usarei a-i
opção para garantir queSTRING/StrING/string
seja capturado corretamente.Linha de comando que fornece o nome dos arquivos:
Linha de comando que remove os nomes dos arquivos e imprime 0 se houver um arquivo sem ocorrências:
fonte
variante recursiva curta :
fonte
Solução somente para grep que testei com grep para windows:
Esta solução contará todas as ocorrências, mesmo se houver várias em uma linha.
-r
pesquisa recursivamente no diretório,-o
"mostra apenas a parte de uma linha que corresponde ao PADRÃO" - é isso que divide várias ocorrências em uma única linha e faz grep imprimir cada correspondência em uma nova linha; canalize esses resultados separados por nova linha de volta ao grep-c
para contar o número de ocorrências usando o mesmo padrão.fonte
Aqui está uma maneira alternativa do AWK mais rápida que a grep, que lida com várias correspondências
<url>
por linha, em uma coleção de arquivos XML em um diretório:Isso funciona bem nos casos em que alguns arquivos XML não possuem quebras de linha.
fonte
Outro oneliner usando funções básicas de linha de comando, manipulando várias ocorrências por linha.
fonte