Filtrar linhas identicas e parecidas [RESOLVIDO]

13. Re: Filtrar linhas identicas e parecidas [RESOLVIDO]

Daniel P. L. Almeida
daniel.uramg

(usa Outra)

Enviado em 27/03/2010 - 12:40h

OK pessoal muito obrigado por tentarem me ajudar =]
hoje n estou na loja, ate tenho acesso por ssh, mas se alguma coisa der errada os uswuarios ficam sem conecção e eu nem fico sabendo, então na segunda feira testo todas as alternativas que me passaram e retorno.
Os segundos realmente não importam!

valew []´s


  


14. Re: Filtrar linhas identicas e parecidas [RESOLVIDO]

Daniel P. L. Almeida
daniel.uramg

(usa Outra)

Enviado em 27/03/2010 - 18:28h

Resolvi fazer as alterações aqui remotamente mesmo, tava doido pra ver os resultados!

fdmarp, não deu certo mesmo assim, continuou logando linhas identicas =/

daemon desta forma deu certo, so tive que fazer uma alteração:
incluindo na mesma linha "sed -r 's/:[0-9]{2} ([AP]M)/ \1/' | sort -u", o sort -u foi ignorado, então fiz assim:
#echo "$DIAHOY $REMOTE_ADDR $mac_user - login.html" | sed -r 's/:[0-9]{2} ([AP]M)/ \1/' >> /usr/local/easycaptive/log/accesos.log
#cat /usr/local/easycaptive/log/accesos.log | sort -u > /usr/local/easycaptive/log/accesos.log

aí sim resolveu o problema.
se for o caso pra votar os segundos, complica muito? somente a titulo de aprendizado, pois acho que não é nescessário.

Muito obrigado fdmarp e deamon
valew inté!


15. Re: Filtrar linhas identicas e parecidas [RESOLVIDO]

Marcos Paulo Ferreira
Daemonio

(usa Slackware)

Enviado em 27/03/2010 - 22:39h

Olhando seu código, dá até para você evitar o uso do sed. Modifique a variável $DIAHOY de modo que ela contenha somente a data e hh:mm, ou seja, retire os segundos aí mesmo para não precisar do sed a frente.

Para manter os segundos, você pode fazer o seguinte:

Antes de redirecionar a saida para seu arquivo de log, verifique se o tempo (em hh:mm) e o ip da linha que será montada já foram adicionados. Basta usar um grep cada vez que uma linha for adicionada, se ele retornar false quer dizer que a linha ainda não está logada no arquivo.

FILE='/usr/local/easycaptive/log/accesos.log'
# Verdade se a linha NAO existe
if ! grep -qE "${DIAHOY_SEM_SEGUNDOS}:[0-9]{2} [AP]M $REMOTE_ADDR" $FILE
then
echo "$DIAHOY_COM_SEGUNDOS $REMOTE_ADDR $mac_user - login.html" >> $FILE
fi

Veja que se:
DIAHOY_COM_SEGUNDOS == "24/03/2010 - 08:01:10 PM"
então
DIAHOY_SEM_SEGUNDOS == "24/03/2010 - 08:01"

Assim deve funcionar sem nos preocuparmos em ordenar o arquivo.

Veja que quando você disponibilizou o seu código as coisas ficaram mais fáceis de serem resolvidas. xD

inté
t+


16. Re: Filtrar linhas identicas e parecidas [RESOLVIDO]

Daniel P. L. Almeida
daniel.uramg

(usa Outra)

Enviado em 28/03/2010 - 09:58h

vixe agora eu me perdi.. e as variaveis DIAHOY_SEM_SEGUNDOS e DIAHOY_COM_SEGUNDOS eu não preciso definir antes?
Pelo que intendi posso fazer assim::

######
http_request 4
echo $(cat "$HTMLPATH"login.html) | sed "s/%CONTRACT%/$CONTRACT/g" | sed "s/%REMAINING%/$REMAINING/g" | sed "s/%ERROR%/$CERROR/g" | sed s\þ%URLPOST%þ$URLþg
# Verdade se a linha NAO existe
access_file='/usr/local/easycaptive/log/accesos.log'
if ! grep -qE "${DIAHOY_SEM_SEGUNDOS}:[0-9]{2} [AP]M $REMOTE_ADDR" $access_file
then
echo "$DIAHOY_COM_SEGUNDOS $REMOTE_ADDR $mac_user ($USER_NAME) - login.html" >> $access_file
fi
##
exit 0
fi

certo?


17. Re: Filtrar linhas identicas e parecidas [RESOLVIDO]

Marcos Paulo Ferreira
Daemonio

(usa Slackware)

Enviado em 28/03/2010 - 13:18h

Tipo, você precisa dessas variáveis sim. O que eu quis dizer é que você precisa de uma variável que tem os segundos e outra que não os tem.
Vamos supor que quando você for criar a sua variável DIAHOY, você cria outra, a DIAHOY_SEM_SEGUNDOS, que nada mais é, uma DIAHOY sem a parte referente aos segundos.

Se
DIAHOY="23/03/2010 - 07:58:13 AM"
então
DIAHOY_SEM_SEGUNDOS="23/03/2010 - 07:58"

Como fazer isso? Simples, só utilizar a expansão do bash:
DIAHOY_SEM_SEGUNDOS=${DIAHOY%:*}

Pronto! Agora você tem duas variáveis que "monitoram" o tempo. Utilize o código que te passei no post acima, trocando DIAHOY_COM_SEGUNDOS por DIAHOY.

Entendeu agora?
t+


18. Re: Filtrar linhas identicas e parecidas [RESOLVIDO]

Daniel P. L. Almeida
daniel.uramg

(usa Outra)

Enviado em 28/03/2010 - 17:46h

Intendi,
não foi necessário fazer assim não, tava ficando era uma bagunça, resolvi dar uma verificada geral no codigo, dar uma organizada e definir variaveis pra todos arquivos pra ficar mais organizado também.
Resovi assim:

DIAHOY_SEM_SEGUNDOS=${DIAHOY%:*}
## CAPTURA ACESSOS DE LOGIN
http_request 4
echo $(cat "$HTMLPATH"login.html) | sed "s/%CONTRACT%/$CONTRACT/g" | sed "s/%REMAINING%/$REMAINING/g" | sed "s/%ERROR%/$CERROR/g" | sed s\þ%URLPOST%þ$URLþg
echo "$DIAHOY_SEM_SEGUNDOS $REMOTE_ADDR $mac_user ($USER_NAME) - login.html" >> $ACLOG
cat $ACLOG | sort -u > $ACLOG
exit 0
fi

Ficou show agora.
Como funciona essa variavel definida "${DIAHOY%:*}" ?
todo o codigo postei http://addons-bfw.dyndns.org/temp/EasyCaptive/index.cgi pra uns colegas baixarem que estavam com o mesmo problema, se quiser dar uma olhada.

Se precisar de alguma coisa no brazilfw conte comigo!

valew []s


19. Re: Filtrar linhas identicas e parecidas [RESOLVIDO]

Marcos Paulo Ferreira
Daemonio

(usa Slackware)

Enviado em 28/03/2010 - 21:12h

Ok! Ficaria mais rápido se você utilizasse o grep no lugar do sort porque para cada linha nova logada um sort será realizado. E ordenar um arquivo é uma tarefa muito custosa.

Mas já que tah funcionando, todo mundo fica feliz :D

Em relação ao ${DIAHOY%:*}, isso se chama expansão de parâmetros. Nesse caso, o bash irá expandir a variável DIAHOY e excluir tudo o que vier depois do último dois pontos.

Veja essa dica que fiz alguns anos atrás:
http://www.vivaolinux.com.br/dica/Truques-para-tratamento-de-variaveis-em-shell-script/

Até mais!!



01 02



Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts