Comparar datas com shell [RESOLVIDO]

1. Comparar datas com shell [RESOLVIDO]

Alan Victor
alanvictorjp

(usa Debian)

Enviado em 18/09/2013 - 03:39h

Boa noite pessoal.

Recentemente venho criando um pequeno programa, uso db textual nele, e estou parado no seguinte problema:

Minha db textual está da seguinte forma, por ex:

cat alan_victor.txt
nome:alan
sobrenome:victor
idade:28
distro:debian
data_criacao:18/09/2013

Imaginem que eu tenho 100 arquivos no diretório, de nomes e "datas de criação" diferentes...
quero fazer uma listagem dos arquivos em ordem crescente ou decrescente, pelo valor da "data_criacao" de cada arquivo.

Até rolava listar pela data do arquivo mesmo, mas se eu modificar o arquivo, a data é alterada pra data atual, por isso a ideia de por a data de criação
dentro do arquivo.

Possível é... só não sei como. :(


  


2. Re: Comparar datas com shell [RESOLVIDO]

Pedro
px

(usa Debian)

Enviado em 18/09/2013 - 06:11h

Vou te dar uma pista!

while, awk, if, cat, grep e divirta-se com as man pages!


3. Re: Comparar datas com shell [RESOLVIDO]

Alexandre Gonçalves Monteiro da Silva
alexandregms

(usa Ubuntu)

Enviado em 18/09/2013 - 08:31h

Aconselho vc dar o passo inicial, tente montar algum comando ou algum script simples e poste suas dúvidas.
Iremos ajuda-lo no que precisar, mas a idéia do fórum não é criar do zero e sim dar o apoio em suas dúvidas! :-)


4. Re: Comparar datas com shell [RESOLVIDO]

Estefanio Brunhara
stefaniobrunhara

(usa CentOS)

Enviado em 18/09/2013 - 09:43h

alanvictorjp escreveu:

Boa noite pessoal.

Recentemente venho criando um pequeno programa, uso db textual nele, e estou parado no seguinte problema:

Minha db textual está da seguinte forma, por ex:

cat alan_victor.txt
nome:alan
sobrenome:victor
idade:28
distro:debian
data_criacao:18/09/2013

Imaginem que eu tenho 100 arquivos no diretório, de nomes e "datas de criação" diferentes...
quero fazer uma listagem dos arquivos em ordem crescente ou decrescente, pelo valor da "data_criacao" de cada arquivo.

Até rolava listar pela data do arquivo mesmo, mas se eu modificar o arquivo, a data é alterada pra data atual, por isso a ideia de por a data de criação
dentro do arquivo.

Possível é... só não sei como. :(


Toda data é um numero inteiro, com base nisto da para você faze suas comparações.
Digite no prompt:

date +%s

veja se isto ajuda você!

abraços!







5. Comparar datas com shell

Alan Victor
alanvictorjp

(usa Debian)

Enviado em 18/09/2013 - 12:23h

estefaniobrunha, estou indo bem por ae...

Achei que alguém já tinha algo pronto pessoal, por isso pedi, hehehe
estou desenrolando já, algumas dúvidas surgem... se eu rodar o mundo e não achar, posto aqui :)
Obrigado pela ajuda de vocês.


6. Re: Comparar datas com shell [RESOLVIDO]

Fernando
phoemur

(usa Debian)

Enviado em 18/09/2013 - 13:49h

Se seus arquivos.txt forem mais ou menos assim:

nome:alan
sobrenome:victor
idade:28
distro:debian
data_criacao:18/09/2013


Então tenta algo assim:

grep -r "data_criacao.*[0-9]\{2\}/[0-9]\{2\}/[0-9]\{4\}" *.txt | tr -d ' ' | sort -t":" -k 3.7,3.10n -k 3.4,3.5n -k 3.1,3.2n



7. Re: Comparar datas com shell [RESOLVIDO]

Alan Victor
alanvictorjp

(usa Debian)

Enviado em 18/09/2013 - 15:04h

phoemur escreveu:

Se seus arquivos.txt forem mais ou menos assim:

nome:alan
sobrenome:victor
idade:28
distro:debian
data_criacao:18/09/2013


Então tenta algo assim:

grep -r "data_criacao.*[0-9]\{2\}/[0-9]\{2\}/[0-9]\{4\}" *.txt | tr -d ' ' | sort -t":" -k 3.7,3.10n -k 3.4,3.5n -k 3.1,3.2n


Preciso estudar esses parâmetros do sort, não entendi nada... hehe
resolvi usar em vez da data tipo:
data_criacao:18/09/2013

estou usando assim:
epoch:1379526865

e abaixo a gambiarra que eu montei...


#!/bin/bash
#epoch=$(date -d "$(date -R -r $(echo $i))" "+%s")

> tmp.dat


todos=$(ls *.txt)
for i in $todos ; do

epoch=$(cat $i |grep epoch | cut -d: -f 2)
echo "${epoch}:${i}" >> tmp.dat
done

oks=$(cat tmp.dat|sort)



for j in $oks ;do
dates=$(echo "$j" | cut -d: -f1)
nomes=$(echo "$j" | cut -d: -f2)
datesok=$(date -d @${dates} '+%d/%m/%Y')

echo "$datesok $nomes"
done


Se der pra ficar melhor, agradeço.


8. Re: Comparar datas com shell [RESOLVIDO]

Alan Victor
alanvictorjp

(usa Debian)

Enviado em 18/09/2013 - 15:17h

pohaaa, que massa...
grep -r "data_criacao.*[0-9]\{2\}/[0-9]\{2\}/[0-9]\{4\}" *.txt | tr -d ' ' | sort -t":" -k 3.7,3.10n -k 3.4,3.5n -k 3.1,3.2n

deu certinho também!!
Vou estudar esses parâmetros do sort agora!!


9. Re: Comparar datas com shell [RESOLVIDO]

Alan Victor
alanvictorjp

(usa Debian)

Enviado em 18/09/2013 - 16:07h

eae phoemur

entendi os parâmetros do sort, só não entendi pra que serve o 'n' no final das especificações dos blocos/caracteres

Procurei com força e não achei nada sobre esse 'n', nem na manpage, na linha do parâmetro -k tem. :(

Me explica ae pra que serve esse 'n'


10. Re: Comparar datas com shell [RESOLVIDO]

Fernando
phoemur

(usa Debian)

Enviado em 18/09/2013 - 18:37h

Nos parametros do sort, com o -t":" você define o separador de campos ":". No nosso caso queremos utilizar o terceiro campo para ordenar as linhas.
Depois com o -k você define os caracteres que serão utilizados para fazer a ordenação...
A forma correta é ordenar primeiro pelos anos, depois pelos meses e por último pelos dias, pois se você começar pelos dias, quando for ver pelo ano bagunça tudo novamente... acho que deu pra entender mais ou menos o que acontece...

por exemplo:
-k 3.7,3.10n significa pra ordenar pelo terceiro campo, setimo caractere(3.7) ao decimo(3.10), ou seja o ano

-k 3.4,3.5n significa pra ordenar pelo terceiro campo, quarto(3.4) ao quinto (3.5) caractere, ou seja o mês

-k 3.1,3.2n significa pra ordenar pelo terceiro campo, primeiro (3.1) ao segundo (3.2) caractere, ou seja os dias.

o n no final significa apenas sequencia numérica... se colocar nr é ordem inversa, pois r de reverse...
Se fosse ordem alfabética teria que ser a opção -f

Se por ventura seus meses estivessem escritos literalmente (Jan, Feb, Mar, Apr, May, Jun, etc... ) você poderia utilizar a opção M maiúsculo que quer dizer meses...
Têm várias opções, e sinceramente não conheço todas, apenas as que mais utilizo...

É fundamental colocar o tr -d ' ' também para apagar os espaços em branco da saída do grep, pois se a pessoa der um espaço entre o : e a data, vai aumentar o numero de caracteres e daí o sort pode pegar os numeros errados e fazer confusão...


11. Re: Comparar datas com shell [RESOLVIDO]

Alan Victor
alanvictorjp

(usa Debian)

Enviado em 19/09/2013 - 02:41h

phoemur escreveu:

Nos parametros do sort, com o -t":" você define o separador de campos ":". No nosso caso queremos utilizar o terceiro campo para ordenar as linhas.
Depois com o -k você define os caracteres que serão utilizados para fazer a ordenação...
A forma correta é ordenar primeiro pelos anos, depois pelos meses e por último pelos dias, pois se você começar pelos dias, quando for ver pelo ano bagunça tudo novamente... acho que deu pra entender mais ou menos o que acontece...

por exemplo:
-k 3.7,3.10n significa pra ordenar pelo terceiro campo, setimo caractere(3.7) ao decimo(3.10), ou seja o ano

-k 3.4,3.5n significa pra ordenar pelo terceiro campo, quarto(3.4) ao quinto (3.5) caractere, ou seja o mês

-k 3.1,3.2n significa pra ordenar pelo terceiro campo, primeiro (3.1) ao segundo (3.2) caractere, ou seja os dias.

o n no final significa apenas sequencia numérica... se colocar nr é ordem inversa, pois r de reverse...
Se fosse ordem alfabética teria que ser a opção -f

Se por ventura seus meses estivessem escritos literalmente (Jan, Feb, Mar, Apr, May, Jun, etc... ) você poderia utilizar a opção M maiúsculo que quer dizer meses...
Têm várias opções, e sinceramente não conheço todas, apenas as que mais utilizo...

É fundamental colocar o tr -d ' ' também para apagar os espaços em branco da saída do grep, pois se a pessoa der um espaço entre o : e a data, vai aumentar o numero de caracteres e daí o sort pode pegar os numeros errados e fazer confusão...


Cara, obrigado pela ajuda, me ajudou muito, suspeitei que a letra 'n' tinha semelhança com o opção -n do sort.
Mais uma vez, obrigado pela ajuda!



12. Re: Comparar datas com shell [RESOLVIDO]

Alexandre Gonçalves Monteiro da Silva
alexandregms

(usa Ubuntu)

Enviado em 19/09/2013 - 09:00h

Cara, muito louco esses parâmetros do sort, mandou mto bem!!
Mais uma que vai pro caderninho .. rs

Fiz outra forma aqui e tb deu certo, não precisou ordenar os caracteres do sort, pois delimitei todos os campos pela "/".

 
grep data_criacao *.txt | awk -F":" '{print $1 "/" $3}' | sort -t'/' -k 4 -k 3 -k 2


Valeu @phoemur pela dica e @alanvictorjp pela questão :-)






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts