Ajuda com script Linux

1. Ajuda com script Linux

Daniel Rocha Bastos
manroot

(usa Ubuntu)

Enviado em 10/07/2023 - 07:37h

Olá, pessoal, não sou um profundo conhecedor de Linux e montagem de scripts, porém tenho uma breve familiaridade com o assunto e acredito que posso ir me virando com uma boa dose de ajuda,
de antemão já agradeço a ajuda de todos... Muito obrigado!

Bom... vamos lá

Estou montando um script onde monitoro algumas notificações recebidas via telegram,
essas notificações são redirecionadas para uma arquivo chamado input.txt e o script é alimentado justamente por esse arquivo.

Exemplo do contéudo inserido no input.txt:
#Price_Notification_ProductABC
Price: 0.006813
change: +1.6%
Count Number: 1

#Price_Notification_ProductABC
Price: 0.006969
change: +2.3%
Count Number: 2

#Price_Notification_ProductABC
Price: 0.007060
change: +1.3%
Count Number: 3

#Price_Notification_ProductABC
Price: 0.007300
change: +3.4%
Count Number: 4

#Price_Notification_ProductABC
Price: 0.007453
change: +2.1%
Count Number: 5


Exemplo de saída após o input.txt ser filtrado via script:
#Price_Notification_ProductABC
Price: 0.006813
change: +1.6%
Count Number: 1

#Price_Notification_ProductABC
Price: 0.006969
change: +3.9%
Count Number: 2

#Price_Notification_ProductABC
Price: 0.007060
change: +5.2%
Count Number: 3

#Price_Notification_ProductABC
Price: 0.007300
change: +8.6%
Count Number: 4

#Price_Notification_ProductABC
Price: 0.007453
change: +10.7%
Count Number: 5


A função do script é ir fazendo a soma de forma incremental do item "change:"

Até esse ponto está tudo ok e o script tem funcionado, porém tenho dois problemas e preciso implementar duas condições para que isso seja solucionado.

1- O percentual precisa ser calculado de forma incremental/crescente, dentro de uma janela de 0 até no máximo 30 minutos entre uma notificação e outra, a partir do minuto 31,
o cálculo incremental do percentual precisa ser zerado/reiniciado, iniciando um novo ciclo de cálculo.

2- Preciso de uma condição onde o valor contido no item "Price:" na notificação atual não seja menor que o valor da notificação anterior, exemplo:

Notificação atual:
Price: 0.006825

Notificação anterior:
Price: 0.007453

Caso ocorra qualquer um dos 2 cenários, o ciclo precisa ser automaticamente reiniciado e a soma das porcentagens zeradas.

Alguma ideia como posso resolver esse pequeno problema em meu script?

Estou montando os 2 scripts abaixo e ambos fazem a mesma coisa, caso consiga ajustar qualquer um dos scripts com as duas condições mencionadas, acredito que boa parte
do meu problema será solucionado.

Script em perl:
Executo da seguinte forma:
perl -lp ./perl.pl input.txt
#!/usr/bin/perl -lp

if (/^#Price_Notification_Product/) {
$prod = $_;
} elsif (/^change: ([^%]*)%/) {
$products{$prod} += $1;
$_ = "change: +$products{$prod}%";


Script com awk:
./awh.sh
#!/bin/bash

awk '
/^#Price_Notification_Product/ {
prod = $0;
}
/^change: / {
gsub(/[+%]/,"",$2);
products[prod] += $2;
$2 = "+" products[prod] "%"
}
1' input.txt




  


2. Re: Ajuda com script Linux

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 10/07/2023 - 22:11h


manroot escreveu:

Olá, pessoal, não sou um profundo conhecedor de Linux e montagem de scripts, porém tenho uma breve familiaridade com o assunto e acredito que posso ir me virando com uma boa dose de ajuda,
de antemão já agradeço a ajuda de todos... Muito obrigado!

Bom... vamos lá

Estou montando um script onde monitoro algumas notificações recebidas via telegram,
essas notificações são redirecionadas para uma arquivo chamado input.txt e o script é alimentado justamente por esse arquivo.

Exemplo do contéudo inserido no input.txt:
#Price_Notification_ProductABC
Price: 0.006813
change: +1.6%
Count Number: 1

#Price_Notification_ProductABC
Price: 0.006969
change: +2.3%
Count Number: 2

#Price_Notification_ProductABC
Price: 0.007060
change: +1.3%
Count Number: 3

#Price_Notification_ProductABC
Price: 0.007300
change: +3.4%
Count Number: 4

#Price_Notification_ProductABC
Price: 0.007453
change: +2.1%
Count Number: 5


Exemplo de saída após o input.txt ser filtrado via script:
#Price_Notification_ProductABC
Price: 0.006813
change: +1.6%
Count Number: 1

#Price_Notification_ProductABC
Price: 0.006969
change: +3.9%
Count Number: 2

#Price_Notification_ProductABC
Price: 0.007060
change: +5.2%
Count Number: 3

#Price_Notification_ProductABC
Price: 0.007300
change: +8.6%
Count Number: 4

#Price_Notification_ProductABC
Price: 0.007453
change: +10.7%
Count Number: 5


A função do script é ir fazendo a soma de forma incremental do item "change:"

Até esse ponto está tudo ok e o script tem funcionado, porém tenho dois problemas e preciso implementar duas condições para que isso seja solucionado.

1- O percentual precisa ser calculado de forma incremental/crescente, dentro de uma janela de 0 até no máximo 30 minutos entre uma notificação e outra, a partir do minuto 31,
o cálculo incremental do percentual precisa ser zerado/reiniciado, iniciando um novo ciclo de cálculo.

2- Preciso de uma condição onde o valor contido no item "Price:" na notificação atual não seja menor que o valor da notificação anterior, exemplo:

Notificação atual:
Price: 0.006825

Notificação anterior:
Price: 0.007453

Caso ocorra qualquer um dos 2 cenários, o ciclo precisa ser automaticamente reiniciado e a soma das porcentagens zeradas.

Alguma ideia como posso resolver esse pequeno problema em meu script?

Estou montando os 2 scripts abaixo e ambos fazem a mesma coisa, caso consiga ajustar qualquer um dos scripts com as duas condições mencionadas, acredito que boa parte
do meu problema será solucionado.

Script em perl:
Executo da seguinte forma:
perl -lp ./perl.pl input.txt
#!/usr/bin/perl -lp

if (/^#Price_Notification_Product/) {
$prod = $_;
} elsif (/^change: ([^%]*)%/) {
$products{$prod} += $1;
$_ = "change: +$products{$prod}%";


Script com awk:
./awh.sh
#!/bin/bash

awk '
/^#Price_Notification_Product/ {
prod = $0;
}
/^change: / {
gsub(/[+%]/,"",$2);
products[prod] += $2;
$2 = "+" products[prod] "%"
}
1' input.txt


Boa noite manroot.
Seguem sugestões:

1 - Se
Notificação atual:
Price: 0.006825

é menor que
Notificação anterior:
Price: 0.007453


O campo:
change: -8.43%
É negativo.
----------------------------------------------------------------------------------------------------------------
Coloquei mais um registro no input.txt
#Price_Notification_ProductABC
Price: 0.006825
change: -8.43%
Count Number: 6


Calculando 'Change', 'stt' e checando o 'tempo'
#Considerando que o script ficara em execução constantemente

count=0;
ini="${EPOCHSECONDS}";
p=($(sed -n 's/^Price: //p' input.txt))

for ((n=1;n<${#p[*]};n++)) {
r=$(awk '{printf "%.02f",(($1/$2)-1)*100}' <<< "${p[$n]} ${p[$((n-1))]}");
stt=$(bc <<< "${r}>0");
echo "${p[$n]} - ${p[$((n-1))]} = $r% Stt:${stt}";
}
while :;do
((${stt} && ((${EPOCHSECONDS}-${ini}<1800)))) && echo calcular || echo "stop/zerar valores"
##comandos para calcular
sleep 60;
let count++; #outra opção
done


Obs00.:
stt=1 se true,
stt=0 se false.

Obs01.: Também pode usar um contador,
O laço acima e executado a cada minuto,
a cada execução, incremente 1,
Se count>30.....
É isso....
______________________________________________________________________
Importante:
lynx --dump https://www.vivaolinux.com.br/termos-de-uso/ | sed -nr '/^[ ]+Se/,/dou.$/p'
______________________________________________________________________
Nota de esclarecimento:
O comando: ACIMA, faz parte da minha assinatura.
Att.: Marcelo Oliver
______________________________________________________________________



3. Re: Ajuda com script Linux

Daniel Rocha Bastos
manroot

(usa Ubuntu)

Enviado em 11/07/2023 - 22:30h


msoliver escreveu:


manroot escreveu:

Olá, pessoal, não sou um profundo conhecedor de Linux e montagem de scripts, porém tenho uma breve familiaridade com o assunto e acredito que posso ir me virando com uma boa dose de ajuda,
de antemão já agradeço a ajuda de todos... Muito obrigado!

Bom... vamos lá

Estou montando um script onde monitoro algumas notificações recebidas via telegram,
essas notificações são redirecionadas para uma arquivo chamado input.txt e o script é alimentado justamente por esse arquivo.

Exemplo do contéudo inserido no input.txt:
#Price_Notification_ProductABC
Price: 0.006813
change: +1.6%
Count Number: 1

#Price_Notification_ProductABC
Price: 0.006969
change: +2.3%
Count Number: 2

#Price_Notification_ProductABC
Price: 0.007060
change: +1.3%
Count Number: 3

#Price_Notification_ProductABC
Price: 0.007300
change: +3.4%
Count Number: 4

#Price_Notification_ProductABC
Price: 0.007453
change: +2.1%
Count Number: 5


Exemplo de saída após o input.txt ser filtrado via script:
#Price_Notification_ProductABC
Price: 0.006813
change: +1.6%
Count Number: 1

#Price_Notification_ProductABC
Price: 0.006969
change: +3.9%
Count Number: 2

#Price_Notification_ProductABC
Price: 0.007060
change: +5.2%
Count Number: 3

#Price_Notification_ProductABC
Price: 0.007300
change: +8.6%
Count Number: 4

#Price_Notification_ProductABC
Price: 0.007453
change: +10.7%
Count Number: 5


A função do script é ir fazendo a soma de forma incremental do item "change:"

Até esse ponto está tudo ok e o script tem funcionado, porém tenho dois problemas e preciso implementar duas condições para que isso seja solucionado.

1- O percentual precisa ser calculado de forma incremental/crescente, dentro de uma janela de 0 até no máximo 30 minutos entre uma notificação e outra, a partir do minuto 31,
o cálculo incremental do percentual precisa ser zerado/reiniciado, iniciando um novo ciclo de cálculo.

2- Preciso de uma condição onde o valor contido no item "Price:" na notificação atual não seja menor que o valor da notificação anterior, exemplo:

Notificação atual:
Price: 0.006825

Notificação anterior:
Price: 0.007453

Caso ocorra qualquer um dos 2 cenários, o ciclo precisa ser automaticamente reiniciado e a soma das porcentagens zeradas.

Alguma ideia como posso resolver esse pequeno problema em meu script?

Estou montando os 2 scripts abaixo e ambos fazem a mesma coisa, caso consiga ajustar qualquer um dos scripts com as duas condições mencionadas, acredito que boa parte
do meu problema será solucionado.

Script em perl:
Executo da seguinte forma:
perl -lp ./perl.pl input.txt
#!/usr/bin/perl -lp

if (/^#Price_Notification_Product/) {
$prod = $_;
} elsif (/^change: ([^%]*)%/) {
$products{$prod} += $1;
$_ = "change: +$products{$prod}%";


Script com awk:
./awh.sh
#!/bin/bash

awk '
/^#Price_Notification_Product/ {
prod = $0;
}
/^change: / {
gsub(/[+%]/,"",$2);
products[prod] += $2;
$2 = "+" products[prod] "%"
}
1' input.txt


Boa noite manroot.
Seguem sugestões:

1 - Se
Notificação atual:
Price: 0.006825

é menor que
Notificação anterior:
Price: 0.007453


O campo:
change: -8.43%
É negativo.
----------------------------------------------------------------------------------------------------------------
Coloquei mais um registro no input.txt
#Price_Notification_ProductABC
Price: 0.006825
change: -8.43%
Count Number: 6


Calculando 'Change', 'stt' e checando o 'tempo'
#Considerando que o script ficara em execução constantemente

count=0;
ini="${EPOCHSECONDS}";
p=($(sed -n 's/^Price: //p' input.txt))

for ((n=1;n<${#p[*]};n++)) {
r=$(awk '{printf "%.02f",(($1/$2)-1)*100}' <<< "${p[$n]} ${p[$((n-1))]}");
stt=$(bc <<< "${r}>0");
echo "${p[$n]} - ${p[$((n-1))]} = $r% Stt:${stt}";
}
while :;do
((${stt} && ((${EPOCHSECONDS}-${ini}<1800)))) && echo calcular || echo "stop/zerar valores"
##comandos para calcular
sleep 60;
let count++; #outra opção
done


Obs00.:
stt=1 se true,
stt=0 se false.

Obs01.: Também pode usar um contador,
O laço acima e executado a cada minuto,
a cada execução, incremente 1,
Se count>30.....
É isso....
______________________________________________________________________
Importante:
lynx --dump https://www.vivaolinux.com.br/termos-de-uso/ | sed -nr '/^[ ]+Se/,/dou.$/p'
______________________________________________________________________
Nota de esclarecimento:
O comando: ACIMA, faz parte da minha assinatura.
Att.: Marcelo Oliver
______________________________________________________________________


Olá, muito obrigado pela ajuda, irei efetuar alguns testes.
Uma ultima dúvida, alguma sugestão de como executar esse script em tempo real?

Como se fosse algo similar ao comando tail -f, alguma sugestão ?

Muito obrigado





4. Re: Ajuda com script Linux

aguamole
aguamole

(usa KUbuntu)

Enviado em 11/07/2023 - 23:12h

O @msoliver entende muito de programação, mas ele geralmente responde a noite, como já é 23:11 ele deve aparecer só amanha agora.
Mas vc pode obter a documentação do bash em $ man bash.
Ou online: https://www.gnu.org/savannah-checkouts/gnu/bash/manual/bash.html


5. Re: Ajuda com script Linux

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 11/07/2023 - 23:45h

manroot escreveu:
Olá, muito obrigado pela ajuda, irei efetuar alguns testes.
Uma ultima dúvida, alguma sugestão de como executar esse script em tempo real?
Como se fosse algo similar ao comando tail -f, alguma sugestão ?

Muito obrigado

Manroot, boa noite.
Como o 'script', depende do arquivo "input.txt",
é interessante rodar o script quando o "input.txt" for alterado....
O comando para isso é o inotifywait
Veja sobre em:
https://www.baeldung.com/linux/monitor-changes-directory-tree
---------------------------------------------------------------------------------
Uma ultima dúvida, alguma sugestão de como executar esse script em tempo real?
Como assim?
Não entendi....
O laço while faz isso, só tirar ou diminuir o sleep....
-----------------------------------------------------------------
while :;do
#com inotifywait
inotifywait -q -e modify input.txt && echo "EXECUTAR_COMANDOS"
#qdo input.txt for modificado...., troque o echo pela function que executara os comandos
done


______________________________________________________________________
Att.: Marcelo Oliver
______________________________________________________________________



6. Re: Ajuda com script Linux

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 11/07/2023 - 23:47h


aguamole escreveu:

O @msoliver entende muito de programação, mas ele geralmente responde a noite, como já é 23:11 ele deve aparecer só amanha agora.
Mas vc pode obter a documentação do bash em $ man bash.
Ou online: https://www.gnu.org/savannah-checkouts/gnu/bash/manual/bash.html


Boa noite AguaMole, Errou..... Rsrsrsrsrsrs
Estava montando um comando "maluco" em awk....., finalmente consegui.....


______________________________________________________________________
Att.: Marcelo Oliver
______________________________________________________________________



7. Re: Ajuda com script Linux

Daniel Rocha Bastos
manroot

(usa Ubuntu)

Enviado em 14/07/2023 - 02:15h


msoliver escreveu:

manroot escreveu:
Olá, muito obrigado pela ajuda, irei efetuar alguns testes.
Uma ultima dúvida, alguma sugestão de como executar esse script em tempo real?
Como se fosse algo similar ao comando tail -f, alguma sugestão ?

Muito obrigado

Manroot, boa noite.
Como o 'script', depende do arquivo "input.txt",
é interessante rodar o script quando o "input.txt" for alterado....
O comando para isso é o inotifywait
Veja sobre em:
https://www.baeldung.com/linux/monitor-changes-directory-tree
---------------------------------------------------------------------------------
Uma ultima dúvida, alguma sugestão de como executar esse script em tempo real?
Como assim?
Não entendi....
O laço while faz isso, só tirar ou diminuir o sleep....
-----------------------------------------------------------------
while :;do
#com inotifywait
inotifywait -q -e modify input.txt && echo "EXECUTAR_COMANDOS"
#qdo input.txt for modificado...., troque o echo pela function que executara os comandos
done


______________________________________________________________________
Att.: Marcelo Oliver
______________________________________________________________________


Olá msoliver, muito obrigado.

Você acabou de responder a minha dúvida, eu gostaria de fazer exatamente isso que você mencionou, pois eu não conhecia o comando inotifywait,

a minha dúvida era nesse sentido mesmo porém não fui muito claro na hora de explicar, minha ideia seria deixar o script sendo executado 100% do tempo para ficar escutando/monitorando as alterações no input.txt,
mas não tinha conhecimento se isso seria possível, pois normalmente utilizo o comando watch para isso, mas pelo que entendi o watch fica reiniciando o processo e dessa forma
provavelmente não atenderia ao que preciso.

O comando inotifywait que você mencionou é de fato a solução que eu preciso.
Muito obrigado!










Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts