[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Alguma forma mais rápida para ler um arq texto sequencial em bash



Só para concluir este assunto.

Removi do meu script a parte do while read SQUID_LINHA ; do...done que embora fosse sequencial e com uma tacada só me proporcionava analise de quase todo tipo de acesso e separação por usuario - era lento pra danado ! Com mais de 12h, o negócio não terminava.

Bem, o que fiz ?
parei de fazer a leitura sequencial, usei um 'awk' para pegar todos os usuarios contidos no log e depois um grep para pegar usuario por usuario e refiz a saída usando outra sintaxe do 'awk' formatando o resultado, resultado ?
O tempo caiu para 11min, por isso AWK rocks !
E só leva 11min porque tem um grep no meio que remove do log acessos considerados de livre acesso e leva 9min! senão seria tudo em 2min.

Só preciso conhecer melhor essa ferramenta porque olhando a sintaxe sem saber o que faz parece código alienigena.

[]'s a todos.

Em 21 de outubro de 2011 16:50, hamacker <sirhamacker@gmail.com> escreveu:
Olha é muito dificil eu não usar um pipe, pegar o primeiro parametro assim :

PARAM_DATA_UNIXTIME=${SQUID_LINHA%% *}

Eu já uso a bastante tempo, mas não há como pegar o segundo parametro, terceiro,... dessa forma, eu tenho que fatiar o relatorio colunado do squid e despachar para outro arquivo aquilo que for importante.
Quando meu script chegou a esse laço while já passou pelos greps da vida que eliminaram efemeridades que não me interessavam.


SQUIDLOG="/var/log/squid3/access.log"
FINISH=$(wc -l "$SQUIDLOG"|cut -d" " -f1)
STARTING=0
while read SQUID_LINHA ; do
  STARTING=$((STARTING+1))
  PERC=$((STARTING*100/$FINISH))
  PARAM_DATA_UNIXTIME=`echo $SQUID_LINHA|cut -d " " -f 1`
  PARAM_DATA_UNIXTIME=`expr "$PARAM_DATA_UNIXTIME-10800"|bc`
  PARAM_DATA=`date +%d-%m-%Y+%H:%M -d "1970-01-01 $PARAM_DATA_UNIXTIME sec"`
  if [ "$PARAM_DATA" = "$DATA_DESEJADA" ] ; then
    PARAM_DURACAO=`expr $SQUID_LINHA|cut -d " " -f 2`
    DURACAO_SEGUNDOS="$[PARAM_DURACAO/100]"
    PARAM_DURACAO=`date +%H:%M:%S -d "1970-01-01 $DURACAO_SEGUNDOS sec"`
    PARAM_CLIENTE=`expr $SQUID_LINHA|cut -d " " -f 3`
    PARAM_RESULTADO=`expr $SQUID_LINHA|cut -d " " -f 4`
    PARAM_BYTES=`expr $SQUID_LINHA|cut -d " " -f 5`
    PARAM_METODO_REQUISITADO=`expr $SQUID_LINHA|cut -d " " -f 6`
    PARAM_URL=`expr $SQUID_LINHA|cut -d " " -f 7`
    PARAM_LOGIN=`expr $SQUID_LINHA|cut -d " " -f 8`
    PARAM_HIERARQUIA_CODIGO=`expr $SQUID_LINHA|cut -d " " -f 9`
    PARAM_MIME=`expr $SQUID_LINHA|cut -d " " -f 10`
    ...
    blablabla....
  fi
done < $SQUIDLOG
 
Na realidade eu perco muito tempo na filtragem, o log do squid tem vários dias armazenados, mas se eu quiser pegar os dados do dia 20-10-2011, e os logs contém arquivos desde o dia 15 então tenho que avançar 5 dias linha-a-linha para finalmente chegar aonde eu desejo. Isso tem sido uma tortura para mim pq mesmo apenas o "while read SQUID_LINHA ; do ... done" já demora bastante até chegar o dia 20.

Eu precisava dum jeito mais rápido.
Eu tô pesando seriamente em facilitar o meu lado por mudar as configurações do squid só para não ter que converter o formato unixdate e realizar um grep mantendo apenas a data desejada. Daí a velocidade aumentaria bastante, a questão é que se eu alterar o formato original do squid, nunca mais vou poder usar algum programa analizador de logs que houverem para ele.

[]'s

Em 21 de outubro de 2011 15:32, Paulino Kenji Sato <pksato@gmail.com> escreveu:

2011/10/21 hamacker <sirhamacker@gmail.com>:
> Ola pessoal,
>
> Eu tenho uma rotina dentro dum batch que reformata e audita o que desejo no
> arquivo de log do squid, porém a medida que o log do squid aumenta torna-se
> insustentável o tempo para ler este arquivo

> Será que há algum outro algorítimo ou função que poderia usar para melhor a
> performance ?

Reescreva isso em awk, perl ou python, ou outra linguagem de sua
preferencia, e não use system('cut -d -f');

O problema do seu script e que faz muito fork, chamando programas
externos, como o cut e ou wc.
O cut -d " " -f 1  pode ser feito em bash, assim:
PARAM_DATA_UNIXTIME=${SQUID_LINHA%% *}


Paulino


--
To UNSUBSCRIBE, email to debian-user-portuguese-REQUEST@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact listmaster@lists.debian.org
Archive: CAMM-fMjcCgdW3PbunyyjSoWYRgAf-_K9_eV6p_UrG3QgdO_g2g@mail.gmail.com" target="_blank">http://lists.debian.org/CAMM-fMjcCgdW3PbunyyjSoWYRgAf-_K9_eV6p_UrG3QgdO_g2g@mail.gmail.com




Reply to: