في قذيفة UNIX ، كيف تحصل على تاريخ الأمس في متغير؟

StackOverflow https://stackoverflow.com/questions/3517982

سؤال

لديّ برنامج نصي Shell الذي يقوم بما يلي لتخزين تاريخ اليوم الحالي في متغير "dt":

date "+%a %d/%m/%Y" | read dt
echo ${dt}

كيف يمكنني الحصول على الحصول على الأمس تاريخ في متغير؟

في الأساس ما أحاول تحقيقه هو استخدام GREP لسحب جميع خطوط الأمس من ملف السجل ، لأن كل سطر في السجل يحتوي على التاريخ بتنسيق "Mon 01/02/2010".

شكرًا جزيلاً

هل كانت مفيدة؟

المحلول

إذا كان لديك بيرل متاح (و date ليس لديه ميزات جميلة مثل yesterday)، يمكنك استخدام:

pax> date
Thu Aug 18 19:29:49 XYZ 2010

pax> dt=$(perl -e 'use POSIX;print strftime "%d/%m/%Y%",localtime time-86400;')

pax> echo $dt
17/08/2010

نصائح أخرى

dt=$(date --date yesterday "+%a %d/%m/%Y")
echo $dt

على Linux ، يمكنك استخدام

date -d "-1 days" +"%a %d/%m/%Y"

يمكنك استخدام أمر تاريخ GNU كما هو موضح أدناه

الحصول على موعد في الماضي

للحصول على أمس واليوم السابق في الماضي الاستخدام قبل يوم سلسلة:

التاريخ -التاريخ = "أمس"

التاريخ -تاريخ = 'قبل يوم' '

التاريخ -تاريخ = '10 يوم ''

التاريخ -التاريخ = '10 قبل أسبوع ''

التاريخ -تاريخ = '10 شهر ''

التاريخ -تاريخ = '10 سنة "

الحصول على موعد في المستقبل

للحصول على غد ويوم بعد غد (غدًا+ن) استخدم كلمة اليوم للحصول على موعد في المستقبل على النحو التالي:

التاريخ -تاريخ = "غدا"

التاريخ -تاريخ = 'يوم' '

التاريخ -تاريخ = '10 يوم

التاريخ -تاريخ = 10 أسبوع "

التاريخ -التاريخ = '10 شهر ''

التاريخ -التاريخ = '10 سنة '

إذا كنت على جهاز Mac أو BSD أو أي شيء آخر بدون خيار -تاريخ ، يمكنك استخدام:

date -r `expr \`date +%s\` - 86400` '+%a %d/%m/%Y'

تحديث: او ربما...

date -r $((`date +%s` - 86400)) '+%a %d/%m/%Y'

لدي برنامج Shell Script في Linux وعملت الكود التالي بالنسبة لي:

#!/bin/bash
yesterday=`TZ=EST+24 date +%Y%m%d` # Yesterday is a variable
mkdir $yesterday # creates a directory with  YYYYMMDD format

لديك خيارات ATLEAST 2

  1. استخدم بيرل:

    perl -e '@T=localtime(time-86400);printf("%02d/%02d/%02d",$T[4]+1,$T[3],$T[5]+1900)'
    
  2. تثبيت تاريخ GNU (إنه في sh_utils الحزمة إذا كنت أتذكر بشكل صحيح)

    date --date yesterday "+%a %d/%m/%Y" | read dt
    echo ${dt}
    
  3. لست متأكدًا مما إذا كان هذا يعمل ، ولكن قد تكون قادرًا على استخدام المنطقة الزمنية السلبية. إذا كنت تستخدم منطقة زمنية قبل 24 ساعة من المنطقة الزمنية الحالية مما يمكنك استخدامه ببساطة date.

هنا نص KSH احسب التاريخ السابق من الحجة الأولى ، تم اختبارها على سولاريس 10.

#!/bin/ksh
 sep=""
 today=$(date '+%Y%m%d')
 today=${1:-today}
 ty=`echo $today|cut -b1-4` # today year
 tm=`echo $today|cut -b5-6` # today month
 td=`echo $today|cut -b7-8` # today day
 yy=0 # yesterday year
 ym=0 # yesterday month
 yd=0 # yesterday day

 if [ td -gt 1 ];
 then
         # today is not first of month
         let yy=ty       # same year
         let ym=tm       # same month
         let yd=td-1     # previous day
 else
         # today is first of month
         if [ tm -gt 1 ];
         then
                 # today is not first of year
                 let yy=ty       # same year
                 let ym=tm-1     # previous month
                 if [ ym -eq 1 -o ym -eq 3 -o ym -eq 5 -o ym -eq 7 -o ym -eq 8 -o ym -     eq 10 -o ym -eq 12 ];
                 then
                         let yd=31
                 fi
                 if [ ym -eq 4 -o ym -eq 6 -o ym -eq 9 -o ym -eq 11 ];
                 then
                         let yd=30
                 fi
                 if [ ym -eq 2 ];
                 then
                         # shit... :)
                         if [ ty%4 -eq 0 ];
                         then
                                 if [ ty%100 -eq 0 ];
                                 then
                                         if [ ty%400 -eq 0 ];
                                         then
                                         #echo divisible by 4, by 100, by 400
                                                 leap=1 
                                         else
                                         #echo divisible by 4, by 100, not by 400
                                                 leap=0
                                         fi
                                 else
                                         #echo divisible by 4, not by 100
                                         leap=1 
                                 fi
                         else
                                 #echo not divisible by 4
                                 leap=0 # not divisible by four
                         fi
                         let yd=28+leap
                 fi
         else
                 # today is first of year
                 # yesterday was 31-12-yy
                 let yy=ty-1     # previous year
                 let ym=12
                 let yd=31
         fi
 fi
 printf "%4d${sep}%02d${sep}%02d\n" $yy $ym $yd

الاختبارات

bin$ for date in 20110902 20110901 20110812 20110801 20110301 20100301 20080301 21000301 20000301 20000101 ; do yesterday $date; done
20110901
20110831
20110811
20110731
20110228
20100228
20080229
21000228
20000229
19991231

جرب الطريقة التالية:

dt=`case "$OSTYPE" in darwin*) date -v-1d "+%s"; ;; *) date -d "1 days ago" "+%s"; esac`
echo $dt

إنه يعمل على كل من Linux و OSX.

شكرًا على المساعدة للجميع ، لكن بما أنني في HP-UX (بعد كل شيء: كلما دفعت أكثر ، قل الميزات التي حصلت عليها ...) لقد اضطررت إلى اللجوء إلى بيرل:

perl -e '@T=localtime(time-86400);printf("%02d/%02d/%04d",$T[3],$T[4]+1,$T[5]+1900)' | read dt

إذا كان تثبيت HP-UX الخاص بك مثبتًا على TCL ، فقد تجد أنه يمكن للقراءة الحسابية في التاريخ (للأسف ، لا تحتوي قذيفة TCL على خيار "-e" لطيف مثل Perl):

dt=$(echo 'puts [clock format [clock scan yesterday] -format "%a %d/%m/%Y"]' | tclsh)
echo "yesterday was $dt"

هذا سوف يتعامل مع جميع مدخرات ضوء النهار عناء.

إذا لم يكن لديك إصدار من التاريخ الذي يدعم -يوم -يوم ولا تريد استخدام Perl ، يمكنك استخدام البرنامج النصي KSH الخاص بي. بشكل افتراضي ، يعيد تاريخ الأمس ، ولكن يمكنك إطعامه رقمًا ويخبرك بالتاريخ الذي يواجه فيه عدة أيام في الماضي. يبدأ التباطؤ قليلاً إذا كنت تبحث بعيدًا في الماضي. منذ 100000 يوم كان 1/30/1738 ، على الرغم من أن نظامي استغرق 28 ثانية لمعرفة ذلك.

    #! /bin/ksh -p

    t=`date +%j`
    ago=$1
    ago=${ago:=1} # in days
    y=`date +%Y`

    function build_year {
            set -A j X $( for m in 01 02 03 04 05 06 07 08 09 10 11 12
                    {
                            cal $m $y | sed -e '1,2d' -e 's/^/ /' -e "s/ \([0-9]\)/ $m\/\1/g"
                    } )
            yeardays=$(( ${#j[*]} - 1 ))
    }

    build_year

    until [ $ago -lt $t ]
    do
            (( y=y-1 ))
            build_year
            (( ago = ago - t ))
            t=$yeardays
    done

    print ${j[$(( t - ago ))]}/$y

KSH93:

dt=${ printf "%(%a %d/%m/%Y)T" yesterday; }

أو:

dt=$(printf "%(%a %d/%m/%Y)T" yesterday)

أول واحد يعمل في نفس العملية ، والثاني في Subshell.

إذا كان لديك وصول إلى python, ، هذا مساعد سيحصل على yyyy-mm-dd قيمة تاريخ أي تعسفي n أيام مضت:

function get_n_days_ago {
  local days=$1
  python -c "import datetime; print (datetime.date.today() - datetime.timedelta(${days})).isoformat()"
}

# today is 2014-08-24

$ get_n_days_ago 1
2014-08-23

$ get_n_days_ago 2
2014-08-22
$var=$TZ;
TZ=$TZ+24;
date;
TZ=$var;

سوف تحصل على أمس في AIX وإعادة متغير TZ إلى الأصل

على الرغم من كل الإجابات الجيدة ، للأسف لم يعمل أي منهم من أجلي. لذلك اضطررت إلى كتابة شيء ما في المدرسة القديمة. (كنت على نظام Linux OS الحد الأدنى)

$ date -d @$( echo $(( $(date +%s)-$((60*60*24)) )) )

يمكنك الجمع بين هذا مع التنسيق المعتاد للتاريخ. على سبيل المثال.

$ date -d @$( echo $(( $(date +%s)-$((60*60*24)) )) ) +%Y-%m-%d

Explanation: خذ مدخلات التاريخ من حيث الثواني EPOC (خيار -D) ، والتي ستطرح منها ثانية واحدة معادلة. هذا سوف يعطي التاريخ بالضبط يوم واحد إلى الوراء.

بالنسبة لـ HP-UX أدناه ، عمل الأمر بالنسبة لي:

TZ = AAA24 DATE +٪ Y ٪ M ٪ D

يمكنك استخدامه على النحو التالي:

ydate = `tz = aaa24 التاريخ +٪ y ٪ m ٪ d`

صدى $ ydate

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top