2013-03-25 10 views
7

Jestem nowy w firmie linux. Jak wydrukować i zapisać datę w danym zakresie dat.Drukuj daty w zakresie dat linux

Na przykład mam startdate = 2013-03-01 i data_konczenia = 2013-03-25; Chcę wydrukować wszystkie daty w tym zakresie.

góry dzięki

Odpowiedz

2

Korzystanie date do konwersji dat do sekundy, zrobić trochę matematyki i przekształcić z powrotem:

#/bin/bash 

dstart=2013-03-01 
dend=2013-03-25 
# convert in seconds sinch the epoch: 
start=$(date -d$dstart +%s) 
end=$(date -d$dend +%s) 
cur=$start 

while [ $cur -le $end ]; do 
    # convert seconds to date: 
    date [email protected]$cur +%Y-%m-%d 
    let cur+=24*60*60 
done 

Zobacz man date uzyskać więcej informacji na temat parametrów daty ..

11

jako o ile daty są w formacie RRRR-MM-DD, można je porównać leksykograficznie i pozwolić, aby date wykonał arytmetykę kalendarza bez konwersji na sekundy pierwsze:

startdate=2013-03-15 
enddate=2013-04-14 

curr="$startdate" 
while true; do 
    echo "$curr" 
    [ "$curr" \< "$enddate" ] || break 
    curr=$(date +%Y-%m-%d --date "$curr +1 day") 
done 

W przypadku [ ... ] należy uciec przed numerem <, aby uniknąć pomyłki z operatorem przekierowania wejścia.

To ma brodawkę drukowania daty rozpoczęcia, jeśli jest większa niż data zakończenia.

+0

Tak, tylko zrobić 'echo "$ Curr"' po teście;) . 'date --date" $ curr +1 day "' jest ładniejsze niż 'let cur = ..' –

+0

Prawdopodobnie lepiej jest umieścić to w pętli for niż pętli while, aby być bezpiecznym. Jeśli sparametryzujesz datę początkową i końcową w skrypcie, pętla będzie miała maksymalną wartość 366 razy lub 1000 razy. To będzie utrzymywać go z nieskończenie pętli. – ekangas

5

Alternatywny jeśli chcesz „” ostatnie terminy to:

echo {100..1} | xargs -I{} -d ' ' date --date={}' days ago' +"%Y-%m-%d" 

Oczywiście nie będzie działać dla dowolnych zakresów dat.

+0

to jest blisko najlepszej odpowiedzi Myślę, że dokonałem zmiany: $ startdate = '2016-03-01'; echo {0..10} | xargs -I {} -d '' date --date = "$ startdate +" {} "dni" + "% Y-% m-% d" 2016-03-01 2016-03-02 2016- 03-03 .... – user5672998

0

Inną opcją jest użycie dateseq z dateutils (http://www.fresse.org/dateutils/#dateseq):

$ dateseq 2013-03-01 2013-03-25 
2013-03-01 
2013-03-02 
2013-03-03 
2013-03-04 
2013-03-05 
2013-03-06 
2013-03-07 
2013-03-08 
2013-03-09 
2013-03-10 
2013-03-11 
2013-03-12 
2013-03-13 
2013-03-14 
2013-03-15 
2013-03-16 
2013-03-17 
2013-03-18 
2013-03-19 
2013-03-20 
2013-03-21 
2013-03-22 
2013-03-23 
2013-03-24 
2013-03-25 
0

lekko ulepszoną wersję

#!/bin/bash 
startdate=2013-03-15 
enddate=2013-04-14 

curr="$startdate" 
while true; do 
    [ "$curr" \< "$enddate" ] || { echo "$curr"; break; } 
    echo "$curr" 
    curr=$(date +%Y-%m-%d --date "$curr +1 day") 
done 
Powiązane problemy