في قذيفة UNIX ، كيف تحصل على تاريخ الأمس في متغير؟
سؤال
لديّ برنامج نصي 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
استخدم بيرل:
perl -e '@T=localtime(time-86400);printf("%02d/%02d/%02d",$T[4]+1,$T[3],$T[5]+1900)'
تثبيت تاريخ GNU (إنه في
sh_utils
الحزمة إذا كنت أتذكر بشكل صحيح)date --date yesterday "+%a %d/%m/%Y" | read dt echo ${dt}
لست متأكدًا مما إذا كان هذا يعمل ، ولكن قد تكون قادرًا على استخدام المنطقة الزمنية السلبية. إذا كنت تستخدم منطقة زمنية قبل 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