парсинг даты в оболочке bash, начните с определенной даты и просматривайте каждый день месяца - PullRequest
12 голосов
/ 17 апреля 2010

Мне нужно создать скрипт оболочки bash, начинающийся с дня, а затем перебирать каждый последующий день, форматируя этот вывод как% Y_% m_d

Я полагаю, что могу указать начальный день, а затем другой параметр для количества дней.

Моя проблема / вопрос в том, как установить ДАТУ (которой нет сейчас), а затем добавить день.

поэтому мой ввод будет 2010_04_01 6

мой вывод будет

2010_04_01
2010_04_02
2010_04_03
2010_04_04
2010_04_05
2010_04_06

Ответы [ 8 ]

20 голосов
/ 17 апреля 2010
[radical@home ~]$ cat a.sh 
#!/bin/bash

START=`echo $1 | tr -d _`;

for (( c=0; c<$2; c++ ))
do
    echo -n "`date --date="$START +$c day" +%Y_%m_%d` ";
done

Теперь, если вы вызовете этот скрипт со своими параметрами, он вернет то, что вы хотели:

[radical@home ~]$ ./a.sh 2010_04_01 6
2010_04_01 2010_04_02 2010_04_03 2010_04_04 2010_04_05 2010_04_06
12 голосов
/ 23 октября 2010

Очень простой скрипт bash должен уметь это делать:

#!/bin/bash 
start_date=20100501
num_days=5
for i in `seq 1 $num_days`
do 
    date=`date +%Y/%m/%d -d "${start_date}-${i} days"`
    echo $date # Use this however you want!
done

Выход:
2010/04/30
2010/04/29
2010/04/28
2010/04/27
2010/04/26

6 голосов
/ 05 февраля 2013

Примечание. Ни одно из решений здесь не будет работать с OS X. Вам может понадобиться, например, что-то подобное:

дата -v-1d +% Y% m% d

Это распечатало бы вчера для вас. Или с подчеркиванием, конечно:

дата -v-1d +% Y_% m_% d

Таким образом, принимая во внимание это, вы сможете настроить некоторые циклы в этих примерах с помощью этой команды. Опция -v позволит вам легко добавлять или вычитать дни, минуты, секунды, годы, месяцы и т. д. и т. д.

2 голосов
/ 17 апреля 2010
#!/bin/bash
inputdate="${1//_/-}"  # change underscores into dashes
for ((i=0; i<$2; i++))
do
    date -d "$inputdate + $i day" "+%Y_%m_%d"
done
1 голос
/ 24 ноября 2015

Вы также можете использовать cal , например

YYYY=2014; MM=02; for d in $(cal $MM $YYYY | grep "^ *[0-9]"); do DD=$(printf "%02d" $d); echo $YYYY$MM$DD; done

(изначально размещено здесь, на моей учетной записи в командной строке )

1 голос
/ 22 октября 2010

Очень простой скрипт bash должен это делать.

Сценарий:
#! / bin / bash

start_date = 20100501
num_days = 5
для меня в seq 1 $num_days
делать
дата = date +%Y/%m/%d -d "${start_date}-${i} days"
echo $ date # Используйте это как хотите!
сделано

Выход:
2010/04/30
2010/04/29
2010/04/28
2010/04/27
2010/04/26

0 голосов
/ 17 апреля 2010

вы можете использовать gawk

#!/bin/bash

DATE=$1
num=$2
awk -vd="$DATE" -vn="$num" 'BEGIN{
   m=split(d,D,"_")
   t=mktime(D[1]" "D[2]" "D[3]" 00 00 00")
   print d
   for(i=1;i<=n;i++){
      t+=86400
      print strftime("%Y_%m_%d",t)
   }
}'

выход

$ ./shell.sh 2010_04_01 6
2010_04_01
2010_04_02
2010_04_03
2010_04_04
2010_04_05
2010_04_06
2010_04_07
0 голосов
/ 17 апреля 2010

Вы можете передать дату через опцию командной строки -d в GNU для обработки даты в нескольких форматах ввода:

http://www.gnu.org/software/coreutils/manual/coreutils.html#Date-input-formats

Передать дату начала в качестве аргумента командной строки или использовать текущую дату:

underscore_date=${1:-$(date +%y_%m_%d)}
date=${underscore_date//_/-}

for days in $(seq 0 6);do 
    date -d "$date + $days days" +%Y_%m_%d;
done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...