msoliver
(usa Debian)
Enviado em 21/02/2017 - 14:53h
baixinho930 escreveu:
msoliver escreveu:
baixinho930 escreveu:
Boa tarde.
Segue sugestão . . .
Estando os ARQUIVOS (log e quedas) no formato que eu sugeri, testei aqui e funcionou.
while read line;do
CLIENTE=$(awk '{print $2}' <<< "$line")
if egrep -q "$CLIENTE voltou" logs.txt;then
sed -ri "/^[0-9]+ ${CLIENTE}/d" quedas.txt
fi
done<quedas.txt
Explicando :
while read line;do #Faz a leitura linha por linha do arquivo quedas.txt, definido em "done<quedas.txt", e coloca na variável "line"
CLIENTE=$(awk '{print $2}' <<< "$line") #Pega o campo "2" de "$line", nome do cliente
if egrep -q "$CLIENTE voltou" logs.txt;then #Busca em log.txt por "$CLIENTE voltou", SE encontrar ...
sed -ri "/^[0-9]+ ${CLIENTE}/d" quedas.txt #Deleta a linha do arquivo quedas.txt
É isso....
att.:
Marcelo Oliver
Deixei como vc disse apenas o que mudei foi a sequecia esta assim NOME STATUS DATA E HORA
mais ai alterei na opção awk
mesmo assim ele nao conseguiu identificar, vc explicando agora o seu exemplo me veio outra duvida, vc disse que esse comando ]if egrep -q "$CLIENTE voltou"[/b] logs.txt;then busca no arquivos logs se o nome voltou, mais ai que esta o arquivo logs sempre vai estar o voltou la isso nao vai ter problema ?
Baixinho, segue ...
#bin/bash
while read line;do
CLIENTE=$(awk '{print $2}' <<< "$line")
if (( $(grep -c "$CLIENTE voltou" log.txt) == $(grep -c "$CLIENTE caiu" log.txt) ));then
sed -ri "/^[0-9]+ ${CLIENTE}/d" quedas.txt
fi
done<quedas.txt
Só exclui de "quedas.txt" se a quantidade de "caiu" e igual a quantidade de "voltou".
cat log.txt
30 jose_leal_cx1 caiu jan/31/2017 09:43:18
33 sirneia_cx1 voltou jan/31/2017 09:40:13 tempo fora 00:45:57
32 casas_por_cabo voltou jan/31/2017 09:10:10 tempo fora 00:02:57
31 casas_por_cabo caiu jan/31/2017 09:07:13
30 sirneia_cx1 caiu jan/31/2017 08:54:16
29 ramos voltou jan/31/2017 08:48:00 tempo fora 00:17:57
28 ramos caiu jan/31/2017 08:30:03
27 maria_cristina voltou jan/31/2017 08:20:07 tempo fora 00:00:57
26 maria_cristina caiu jan/31/2017 08:19:10
OBS.:
Se alterou o log, (tirou a sequência numérica)
Altere o sed para:
sed -ri "/^${CLIENTE}/d" quedas.txt
marcelo oliver
Quero usar essa opção, mais exemplo se eu tenho um log de algum equipamento que caiu
EX: 30 jose_leal_cx1 caiu jan/31/2017 09:43:18
Esse log foi enviado para quedas.txt e depois de um tempo ele volta e é enviado para logs.txt 30 jose_leal_cx1 voltou jan/31/2017 09:48:18
pelo que eu entendi como ele tem o mesmo numero de voltou com o caiu ele autamaticamente vai excluir o arquivo de quedas.txt mais e esse log de voltou vai continuar no arquivo logs.txt, ai se esse equipamento voltar a caiu novamente ele vai para quedas.txt e quando voltar vai para logs.txt só que como ja tinha um voltou no logs.txt ele vai ter 2 e nesse caso não exclui...poderia dar uma luz por favor, obrigado.
Boa tarde Baixinho.
O arquivo de "log" é cumulativo?
Se, João caiu, vai para quedas.txt
João voltou...
O script verifica no ARQUIVO log.txt, "01 João caiu" e igual "01 João voltou"
Deleta de quedas...
Se João cair novamente, vai para quedas.txt, e, a não ser que esteja DELETANDO a "linha João caiu" do LOG, no mesmo existem
02 João caiu e 01 João voltou,
E em quedas.txt deve constar joão caiu . . .
Quando João voltar, 02 caiu = 02 voltou, deleta de quedas . . .
Uma opção é,
Quando deletar de quedas, delete as linhas referentes ao CLIENTE do arquivo de log.
Só incluir o comando no script . . .
#bin/bash
while read line;do
CLIENTE=$(awk '{print $2}' <<< "$line")
if (( $(grep -c "$CLIENTE voltou" log.txt) == $(grep -c "$CLIENTE caiu" log.txt) ));then
sed -ri "/^${CLIENTE}/d" quedas.txt
sed -ri "/^${CLIENTE}/d" log.txt
fi
done<quedas.txt
OBS.: Qdo o nº de quedas for igual ao nº de voltou, apaga a linha(s) de quedas.txt e de log.txt
Att.:
marcelo oliver