Ao pessoal que manja de códigos das ostras, um help aqui [RESOLVIDO]

1. Ao pessoal que manja de códigos das ostras, um help aqui [RESOLVIDO]

Samuel Leonardo
SamL

(usa XUbuntu)

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

Olá, alguém que possa me ajudar entender como criar um comando básico em shell que leia um padrão como:
Num txt:
dia/mes/ano [ignora o que tem aqui] de hora:min[:segundos] até às hora:min[:segundos]

Eu sei muito bem fazer isso em C ou C++, mas eu quero inovar dessa vez fazer em shell script.
Não quero que façam por mim, quero aprender como fazer em shell.

O que preciso saber é:
1-como ler linha a linha o txt
2-depois de ler a linha, como "separar o joio do trigo?", no caso deixando só a data depois as duas horas? (que as vezes vem com segundos como opcional)
3-depois disso, como que comando eu uso pra parsear pra data e hora? Me dê exemplos que entendo melhor.
4-como com a data e horas, como fazer a diferença em minutos entre as duas horas?

É tudo que pensei no momento.


https://nerdki.blogspot.com/ acessa ai, é grátis
Não gostou? O ícone da casinha é serventia do site!


  


2. MELHOR RESPOSTA

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 15/02/2023 - 19:35h

SamL escreveu:

Olá, alguém que possa me ajudar entender como criar um comando básico em shell que leia um padrão como:
Num txt:
dia/mes/ano [ignora o que tem aqui] de hora:min[:segundos] até às hora:min[:segundos]

Eu sei muito bem fazer isso em C ou C++, mas eu quero inovar dessa vez fazer em shell script.
Não quero que façam por mim, quero aprender como fazer em shell.

O que preciso saber é:
1-como ler linha a linha o txt
2-depois de ler a linha, como "separar o joio do trigo?", no caso deixando só a data depois as duas horas? (que as vezes vem com segundos como opcional)
3-depois disso, como que comando eu uso pra parsear pra data e hora? Me dê exemplos que entendo melhor.
4-como com a data e horas, como fazer a diferença em minutos entre as duas horas?

É tudo que pensei no momento.


https://nerdki.blogspot.com/ acessa ai, é grátis
Não gostou? O ícone da casinha é serventia do site!


Boa noite SamL.
Para ler linha a linha, é bem simples:
while read line;do
echo $line
done<arquivo.txt
Poste um exemplo do seu arquivo,
de acordo com o conteúdo das linhas, usa se o comando mais elaborado/apropriado....
Por exemplo:
Se seguem um padrão, mesmo número de campos, uso o awk
Se tem variação, uso regex para "pegar" o que preciso . . . .
----------------------------------------------------------------------------------------------------------------
Exemplo: arq sem padrão
cat arq.txt
01/02/2023 ignora o que tem aqui de 08:10:30 até às 18:00:00
02/02/2023 ignora o que tem aqui tambem de 08:20:30 até às 18:30:00
03/02/2023 ignora o que tem aqui tambem novamente de 08:30:30 até às 18:40:00

sed -r 's/[^0-9 :/]+//g;s/[ ]{2,}/ /g' arq.txt
01/02/2023 08:10:30 18:00:00
02/02/2023 08:20:30 18:30:00
03/02/2023 08:30:30 18:40:00
----------------------------------------------------------------------------------------------------------------
arq com padrão
cat arq.txt
01/02/2023 ignora o que tem aqui de 08:10:30 até às 18:00:00
02/02/2023 ignora o que tem aqui de 08:20:30 até às 18:30:00
03/02/2023 ignora o que tem aqui de 08:30:30 até às 18:40:00

awk '{print $1,$8,$11}' arq.txt
01/02/2023 08:10:30 18:00:00
02/02/2023 08:20:30 18:30:00
03/02/2023 08:30:30 18:40:00
----------------------------------------------------------------------------------------------------------------
Exemplo:
sed -r 's/[^0-9 :/]+//g;s/[ ]{2,}|[/:]/ /g' arq.txt|awk '{data=$3" "$2" "$1;ti=strftime("%s",mktime(data" "$4" "$5" "$6));tf= strftime("%s",mktime(data" "$7" "$8" "$9));printf "Minutos: %s\n",(tf-ti)/60 }' 

Minutos: 600
Minutos: 609.5
Minutos: 849.5
-----------------------------------------------------------------------------------------------------------------
Editado

exec 3< <(sed -r 's/[^0-9 :/]+//g;s/[ ]{2,}|[/:]/ /g' arq.txt);
cat calc.awk
BEGIN {h = 3600;}

{
data = $3 " " $2 " " $1
ti = mktime(data " " $4 " " $5 " " $6)
tf = mktime(data " " $7 " " $8 " " $9)
dif = tf - ti
dh = int(dif / h)
dm = int((dif % h) / 60)
ds = int((dif % h) % 60)
mn = dif / 60
gsub(" ", "/", data)
printf "Dt:%s Hor:%02d Min:%02d Seg:%02d Min_total:%.2f uts:%s\n",data, dh, dm, ds, mn, dif
}

awk -f calc.awk "/dev/fd/3";exec 3<&-;
#----------------------------------------------------------------#

Solução em bash
exec 3< <(sed -r 's/[^0-9 :/]+//g;s/[ ]{2,}|[/]/ /g' arq.txt);
while IFS=" " read -a c -u3;do
data=${c[2]}"-"${c[1]}"-"${c[0]};
ent=$(date -d"${data} ${c[3]}" +%s);
sai=$(date -d"${data} ${c[4]}" +%s);
dm=$(((${sai}-${ent})/60));
dh=$((${dm}/60));
printf "Dt:%s Min:%s Hr:%s\n" ${data//-/\/} ${dm} ${dh};
done
exec 3<&-;
#FIM#
______________________________________________________________________
Att.: Marcelo Oliver
______________________________________________________________________


3. Re: Ao pessoal que manja de códigos das ostras, um help aqui [RESOLVIDO]

leandro peçanha scardua
leandropscardua

(usa Ubuntu)

Enviado em 16/02/2023 - 08:13h


Vc pode usar o comando cut para fazer sucessivas simplificações. Primeiro corta no "de", depois no "até as" e assim por diante.


4. Re: Ao pessoal que manja de códigos das ostras, um help aqui [RESOLVIDO]

Samuel Leonardo
SamL

(usa XUbuntu)

Enviado em 16/02/2023 - 15:35h

Pessoal, desculpa ai a demora, meu sistema quebrou o dpkg e tava até agora tentando resolver aqui. Mais tarde passo aqui pra comentar com calma o que foi sugerido.


https://nerdki.blogspot.com/ acessa ai, é grátis
Não gostou? O ícone da casinha é serventia do site!


5. Re: Ao pessoal que manja de códigos das ostras, um help aqui [RESOLVIDO]

Samuel Leonardo
SamL

(usa XUbuntu)

Enviado em 17/02/2023 - 06:31h

Nossa Marcelo, entendi foi quase nada hahaha
Shell envolve muito símbolos, e não tô acostumado a tanto.
Vou procurar mais tarde um tutorial sobre shell script, sed e awk. No momento tô ocupado mas ainda hoje eu vejo.
Valeu ai a amostra grátis!


https://nerdki.blogspot.com/ acessa ai, é grátis
Não gostou? O ícone da casinha é serventia do site!


6. Re: Ao pessoal que manja de códigos das ostras, um help aqui [RESOLVIDO]

Samuel Leonardo
SamL

(usa XUbuntu)

Enviado em 17/02/2023 - 06:31h


leandropscardua escreveu:
Vc pode usar o comando cut para fazer sucessivas simplificações. Primeiro corta no "de", depois no "até as" e assim por diante.

Opa, vou ver daqui a pouco, com o que o Marcelo mostrou ali tenho uma leve noção de como fazer.
Valeu.


https://nerdki.blogspot.com/ acessa ai, é grátis
Não gostou? O ícone da casinha é serventia do site!


7. Re: Ao pessoal que manja de códigos das ostras, um help aqui [RESOLVIDO]

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 17/02/2023 - 16:12h


SamL escreveu:

Nossa Marcelo, entendi foi quase nada hahaha
Shell envolve muito símbolos, e não tô acostumado a tanto.
Vou procurar mais tarde um tutorial sobre shell script, sed e awk. No momento tô ocupado mas ainda hoje eu vejo.
Valeu ai a amostra grátis!
https://nerdki.blogspot.com/ acessa ai, é grátis
Não gostou? O ícone da casinha é serventia do site!

Boa tarde SamL,
Os "sìmbolos" que não acostumo, são os do descritor de arquivos,
sempre recorro para as anotações.
Pra te ajudar, segue uma explicação, Referente a opção "BASH"
Linha 1 - Limpa o arquivo, só fica o que interessa para efetuar os calculos
sed -r '
/[^0-9 :/]+//g; => Expressao Regular: O que é diferente de 0-9, espaço e '/', apague
s/[ ]+|[/]/ /g; => Troca espaços e '/' por espaço
saída:
01 02 2023 00:10:30 18:00:00
Necessário separar a data, pois tanto o comando date qto o awk,
requerem no formato: YYYY MM DD
#COLOCA A saída do comando no "FD3" => FD="descritor de arquivos"
#---------------------------------------------------------------#

Linha 2
Pega linha a linha do fd3 (opção -u do read) e coloca na array 'c' (read -a),
=> veja: read --help|grep '\-[au]'
considerando o IFS=espaço, 5 campos por linha, sendo:
c[0], c[1], c[2], c[3], c[4]
#---------------------------------------------------------------#

Linha 3
Cria a var data=YYYY-MM-DD
#---------------------------------------------------------------#
Linha 4
Cria a var ent=inicio
Resultado em "%s" => "Epoch Unix Timestamp"

#---------------------------------------------------------------#
Linha 5
Cria a var sai=termino
Resultado em %s
#---------------------------------------------------------------#
Linha 6
Cria a var dm=Diferença em minutos

#---------------------------------------------------------------#
Linha 7
var dh=diferença em horas

#---------------------------------------------------------------#
Linha 8
Printa resultados:
${data//-/\/} => Coloca o separador "-" na var data
YYYY-MM-DD
#---------------------------------------------------------------#
Linha 9
encerra o laço while
#---------------------------------------------------------------#
Linha 10
Fecha o fd3
#---------------------------------------------------------------#

#---------------------------------------------------------------#
Bash "básico", sem descritor de arquivos e array:
sed -r 's/[^0-9 :/]+//g;s/[ ]{2,}|[/]/ /g' arq.txt > temp.txt;
wait;
while IFS=" " read -r c0 c1 c2 c3 c4;do #Considerando o separador de campos=espaço, gera as variáveis c0..c4
data=${c2}"-"${c1}"-"${c0};
ent=$(date -d"${data} ${c3}" +%s);
sai=$(date -d"${data} ${c4}" +%s);
dm=$(((${sai}-${ent})/60));
dh=$((${dm}/60));
printf "Dt:%s Min:%s Hr:%s\n" ${data//-/\/} ${dm} ${dh};
done<temp.txt

Qquer duvida, é só chamar....

______________________________________________________________________
Att.: Marcelo Oliver
______________________________________________________________________



8. Re: Ao pessoal que manja de códigos das ostras, um help aqui [RESOLVIDO]

Samuel Leonardo
SamL

(usa XUbuntu)

Enviado em 19/02/2023 - 11:48h

Voltando.

Obrigado ai pelo esclarecimento, Marcelo, agora entendo mais como é o processo.
Depois do almoço vou fazer uns testes aqui pra ver se consigo fazer o que quero.
Qualquer dúvida, venho por aqui de novo.

https://nerdki.blogspot.com/ acessa ai, é grátis
Não gostou? O ícone da casinha é serventia do site!


9. Re: Ao pessoal que manja de códigos das ostras, um help aqui [RESOLVIDO]

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 23/02/2023 - 18:16h


SamL escreveu:
Depois do almoço vou fazer uns testes
.
.
.


E ai SamL, já almoçou? . . . . Rsrsrsrsrsrs


______________________________________________________________________

Att.: Marcelo Oliver
______________________________________________________________________



10. Re: Ao pessoal que manja de códigos das ostras, um help aqui [RESOLVIDO]

Samuel Leonardo
SamL

(usa XUbuntu)

Enviado em 23/02/2023 - 19:56h


msoliver escreveu:


SamL escreveu:
Depois do almoço vou fazer uns testes
.
.
.


E ai SamL, já almoçou? . . . . Rsrsrsrsrsrs

Esse almoço já foi para o mar, se é que me entende hahaha
Desculpa ai a falta de feedback, não esqueci esse tópico. Ficou corrido aqui com outro projeto mas ainda mantenho a ideia de aprender mais sobre shell.

No caso, eu tava vendo sobre sed e pude entender mais sobre teu raciocínio ali no código de exemplo.
Como ainda sou noob com shell, preciso procurar fontes pra novatos, mas tua explicação me deu um norte.

A quem tiver interesse, achei um mega tutorial de sed aqui:
https://linuxhint.com/50_sed_command_examples/
Mais fácil que isso, só raptando o Marcelo e obrigando ele fazer os código.

Vou deixar aberto o tópico por enquanto pra quando eu voltar mexer com shell novamente.
Então aguarde ai.

https://nerdki.blogspot.com/ acessa ai, é grátis
Não gostou? O ícone da casinha é serventia do site!






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts