Obtendo a contagem combinada de todas as ocorrências de uma string sob vários diretórios?

3

Eu tenho um (espero) problema interessante que eu poderia usar alguns conselhos sobre. Eu tenho um sistema que é essencialmente usado para armazenar logs. Tem uma estrutura de diretórios como:

YYYY/MM/DD/hostname/

Existem vários nomes de host, e sob cada um deles há um monte de logs de hora em hora gzipped (acesso, erro, etc).

O que me interessa é a contagem total de uma determinada string nos logs de acesso divididos por dia e hostname. Qual é a melhor forma de fazer isso? Isso é possível com uma combinação de find e grep, ou é muito complicado para isso e precisa de um script?

    
por c0degeek 12.08.2014 / 21:41

2 respostas

6
for d in */*/*/*; do
  printf '%s: ' "$d"
  zcat -- "$d/"*.gz | grep -Fc STRING
done

contaria o número de linhas que contêm STRING.

Substitua grep -Fc STRING por grep -Fo STRING | wc -l (assumindo o GNU grep ) para ter o número de ocorrências.

Substitua zcat por gzip -dc se o seu zcat não suportar .gz arquivos.

Com zsh e% GNUgrep, você pode encurtá-lo para:

for d (*/*/*/*) zcat $d/*.gz | grep -FcH --label=$d STRING
    
por 12.08.2014 / 21:56
3

Se você quiser fazer isso sem um analisador de log padrão, você pode fazê-lo em uma "linha única" de shell a partir do diretório que contém seus diretórios AAAA:

for d in */*/*; do 
  echo -n "$d : "
  find $d -name *.log | xargs grep -c STRING
done
    
por 12.08.2014 / 21:48

Tags