ATUALIZAÇÃO DE QUEDAS, awk, cut, cat qual usar ?

13. Re: ATUALIZAÇÃO DE QUEDAS, awk, cut, cat qual usar ?

David
baixinho930

(usa Ubuntu)

Enviado em 31/01/2017 - 12:53h

SmithuX escreveu:

baixinho930 escreveu:

SmithuX escreveu:

baixinho930 escreveu:
Acho que não entendeu, esse comando vai fazer com que o log voltou seja enviado para o arquivo quedas.txt o que eu preciso é enviar as quedas para o arquivo e quando voltar ele ser excluido

Não cara, o comando de exemplo no CRON vai exatamente remover a volta do arquivo quedas.txt, como você queria.


"Não há nada como a liberdade!" (Nelson Mandela)


Mais não existe arquivos com nome voltou no arquivo quedas.txt


Eu só dei um exemplo, você deve ajustar conforme suas necessidades.


"Não há nada como a liberdade!" (Nelson Mandela)



mais esse comando sed -i se eu colocar ele para rodar no crontab ele vai excluir os meus arquivos que vão estar la dentro, poderia me explicar esse comando por favor ?




  


14. Re: ATUALIZAÇÃO DE QUEDAS, awk, cut, cat qual usar ?

Phillipe Smith
SmithuX

(usa Arch Linux)

Enviado em 31/01/2017 - 13:26h

A opção -i ou --in-place do sed faz com que ele altere o arquivo de acordo a a expressão regular que foi passada.

Portanto, no exemplo que te passei, o sed vai procurar linhas no arquivo que contenham a palavra voltou ( /voltou/ ) e, após encontrar, é passado uma ação a ser feita, no caso ( d ) deletar a linha.


"Não há nada como a liberdade!" (Nelson Mandela)


15. Re: ATUALIZAÇÃO DE QUEDAS, awk, cut, cat qual usar ?

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 31/01/2017 - 14:06h

baixinho930 escreveu:

Ola queria fazer um script mais estou com muita dificuldade e na verdade não sei se existe a possibilidade.

Bom, eu tenho um arquivo de logs de quedas da minha rede ou seja todos logs vai para um arquivo txt, quando volta ou quando cai tudo vai para esse arquivo, o que eu estou tentando fazer é, criar um outro arquivo txt apenas com as quedas, na verdade isso eu ja consegui, criei esse arquivo quedas.txt e tudo que cai eu consigo direcionar os logs para esse arquivo, mais o problema é que quando o equipamento volta eu nao consigo encontrar um comando que identifique isso e tira esse log do arquivo quedas.txt

exemplo

arquivo de logs.txt
34 - # 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 - # recepção casas_por cabo voltou jan/31/2017 09:10:10 tempo fora 00:02:57
31 - # recepção 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 - # cliente maria cristina voltou jan/31/2017 08:20:07 tempo fora 00:00:57
26 - # cliente maria cristina caiu jan/31/2017 08:19:10

arquivo de quedas.txt
34 - # jose leal cx1 caiu jan/31/2017 09:43:18
31 - # recepção casas_por cabo caiu jan/31/2017 09:07:13
30 - # sirneia cx1 caiu jan/31/2017 08:54:16
26 - # cliente maria cristina caiu jan/31/2017 08:19:10


O que estou tentando fazer é encontrar um comando que identifique no momento que os logs que estão no arquivo quedas.txt voltou ele saia desse arquivo, ou seja excluido algo assim, Obrigado


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


16. Re: ATUALIZAÇÃO DE QUEDAS, awk, cut, cat qual usar ?

David
baixinho930

(usa Ubuntu)

Enviado em 01/02/2017 - 16:48h




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 ?




17. Re: ATUALIZAÇÃO DE QUEDAS, awk, cut, cat qual usar ?

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 02/02/2017 - 01:18h

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


18. Re: ATUALIZAÇÃO DE QUEDAS, awk, cut, cat qual usar ?

David
baixinho930

(usa Ubuntu)

Enviado em 21/02/2017 - 09:08h

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.





19. Re: ATUALIZAÇÃO DE QUEDAS, awk, cut, cat qual usar ?

José da Silva
zenull

(usa Outra)

Enviado em 21/02/2017 - 09:27h

Veja se isso te ajuda:
http://thobias.org/doc/sosed.html


20. Re: ATUALIZAÇÃO DE QUEDAS, awk, cut, cat qual usar ?

Marcelo Oliver
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



21. Re: ATUALIZAÇÃO DE QUEDAS, awk, cut, cat qual usar ?

David
baixinho930

(usa Ubuntu)

Enviado em 22/02/2017 - 16:02h

msoliver escreveu:

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



Deu certo sim, modifiquei algumas coisas mais deu sim, mais estou com um problema ainda que as vezes ele nao exclui do quedas e exclui do logs, mais eu acho que pode ser a maneira que ele esta pegando os logs, eu fiz um script que a cada 20 segundos ele acessa um equipamento (routerboard mikrotik) faz o download do log, faz a edição, envia o que caiu para quedas e que voltou para logs e ai entra em ação a remoção das linhas que voltou, mais nesse meio termo que ele acessa o log da routerboard e faz o download pode ser que da algum problema e acaba nao excluindo do quedas.

Quero fazer um teste mais nao lembro o comando, vamos supor que tenho uma lista com 10 linhas e quero pegar esse arquivo com 10 linhas e transformar em 10 arquivos.


22. Re: ATUALIZAÇÃO DE QUEDAS, awk, cut, cat qual usar ?

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 23/02/2017 - 11:41h

baixinho930 escreveu:

msoliver escreveu:

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



Deu certo sim, modifiquei algumas coisas mais deu sim, mais estou com um problema ainda que as vezes ele nao exclui do quedas e exclui do logs, mais eu acho que pode ser a maneira que ele esta pegando os logs, eu fiz um script que a cada 20 segundos ele acessa um equipamento (routerboard mikrotik) faz o download do log, faz a edição, envia o que caiu para quedas e que voltou para logs e ai entra em ação a remoção das linhas que voltou, mais nesse meio termo que ele acessa o log da routerboard e faz o download pode ser que da algum problema e acaba nao excluindo do quedas.

Quero fazer um teste mais nao lembro o comando, vamos supor que tenho uma lista com 10 linhas e quero pegar esse arquivo com 10 linhas e transformar em 10 arquivos.


Bom dia Baixinho,
Deu certo sim, modifiquei algumas coisas mais deu sim
Modificou o que?

Quero fazer um teste mais nao lembro o comando, vamos supor que tenho uma lista com 10 linhas e quero pegar esse arquivo com 10 linhas e transformar em 10 arquivos.[/quote]

Que eu conheço, é uma sequência de comandos . . . .
Leia "linha por linha"
Envie cada linha para um arquivo . . .
Bastante simples . . .

Marcelo Oliver





23. Re: ATUALIZAÇÃO DE QUEDAS, awk, cut, cat qual usar ?

David
baixinho930

(usa Ubuntu)

Enviado em 23/02/2017 - 12:54h

msoliver escreveu:

baixinho930 escreveu:

msoliver escreveu:

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



Deu certo sim, modifiquei algumas coisas mais deu sim, mais estou com um problema ainda que as vezes ele nao exclui do quedas e exclui do logs, mais eu acho que pode ser a maneira que ele esta pegando os logs, eu fiz um script que a cada 20 segundos ele acessa um equipamento (routerboard mikrotik) faz o download do log, faz a edição, envia o que caiu para quedas e que voltou para logs e ai entra em ação a remoção das linhas que voltou, mais nesse meio termo que ele acessa o log da routerboard e faz o download pode ser que da algum problema e acaba nao excluindo do quedas.

Quero fazer um teste mais nao lembro o comando, vamos supor que tenho uma lista com 10 linhas e quero pegar esse arquivo com 10 linhas e transformar em 10 arquivos.


Bom dia Baixinho,
Deu certo sim, modifiquei algumas coisas mais deu sim
Modificou o que?

Quero fazer um teste mais nao lembro o comando, vamos supor que tenho uma lista com 10 linhas e quero pegar esse arquivo com 10 linhas e transformar em 10 arquivos.


Que eu conheço, é uma sequência de comandos . . . .
Leia "linha por linha"
Envie cada linha para um arquivo . . .
Bastante simples . . .

Marcelo Oliver


[/quote]



Qual seria esse comando para fazer todas linhas virarem arquivos ?




01 02



Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts