44

現在の日付を変数「dt」に格納するために次のことを行うシェルスクリプトがあります。

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

昨日の日付を変数に入れるにはどうすればよいですか?

ログの各行には「Mon 01/02/2010」形式の日付が含まれているため、基本的に私が達成しようとしているのは、grep を使用してログ ファイルから昨日の行をすべてプルすることです。

どうもありがとう

4

17 に答える 17

76
dt=$(date --date yesterday "+%a %d/%m/%Y")
echo $dt
于 2010-08-19T01:12:57.483 に答える
53

Linuxでは、次を使用できます

date -d "-1 days" +"%a %d/%m/%Y"
于 2010-08-19T03:52:17.427 に答える
17

以下に示すように、GNU date コマンドを使用できます。

過去の日付を取得する

過去の昨日と前日を取得するには、string day ago を使用します。

日付 --date='昨日'

date --date='1 日前'

date --date='10日前'

date --date='10 週間前'

date --date='10 か月前'

date --date='10年前'

将来の日付を取得する

明日と明後日 (tomorrow+N) を取得するには、次のように day ワードを使用して将来の日付を取得します。

日付 --date='明日'

日付 --date='1 日'

日付 --date='10 日'

date --date='10週'

date --date='10月'

date --date='10 年'

于 2015-09-08T05:10:02.283 に答える
14

Perl が利用できる場合 (そして の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
于 2010-08-19T01:34:32.387 に答える
10

--date オプションのない Mac や BSD などを使用している場合は、次を使用できます。

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

更新:またはおそらく...

date -r $((`date +%s` - 86400)) '+%a %d/%m/%Y'
于 2010-08-19T01:11:53.640 に答える
7

Linuxにシェルスクリプトがあり、次のコードが機能しました:

#!/bin/bash
yesterday=`TZ=EST+24 date +%Y%m%d` # Yesterday is a variable
mkdir $yesterday # creates a directory with  YYYYMMDD format
于 2014-06-11T20:41:27.453 に答える
4

少なくとも 2 つのオプションがあります

  1. パールを使用:

    perl -e '@T=localtime(time-86400);printf("%02d/%02d/%02d",$T[4]+1,$T[3],$T[5]+1900)'
    
  2. GNU date をインストールします (sh_utils私の記憶が正しければパッケージに含まれています)。

    date --date yesterday "+%a %d/%m/%Y" | read dt
    echo ${dt}
    
  3. これが機能するかどうかはわかりませんが、負のタイムゾーンを使用できる可能性があります。現在のタイムゾーンよりも 24 時間前のタイムゾーンを使用する場合は、単純にdate.

于 2010-08-19T01:08:53.913 に答える
4

次の方法を試してください。

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

Linux と OSX の両方で動作します。

于 2014-05-15T15:41:16.040 に答える
3

これは、 Solaris 10でテストされた、最初の引数の前の日付を計算する ksh スクリプトです。

#!/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
于 2011-09-02T10:03:32.350 に答える
2

皆さんの助けに感謝しますが、私は HP-UX を使用しているため (結局のところ: お金を払えば支払うほど、得られる機能は少なくなります...)、perl に頼らざるを得ませんでした:

perl -e '@T=localtime(time-86400);printf("%02d/%02d/%04d",$T[3],$T[4]+1,$T[5]+1900)' | read dt
于 2010-08-19T03:18:03.680 に答える
2

ksh93:

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

また:

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

最初のものは同じプロセスで実行され、2 つ目はサブシェルで実行されます。

于 2013-01-31T01:54:02.277 に答える
2

HP-UX インストールに Tcl がインストールされている場合、日付演算が非常に読みやすいことに気付くかもしれません (残念ながら、Tcl シェルには perl のような優れた「-e」オプションがありません)。

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

これは、すべての夏時間の煩わしさを処理します。

于 2010-08-19T12:40:02.650 に答える
2

にアクセスできる場合、これは任意の日前pythonの日付値を取得するヘルパーです。yyyy-mm-ddn

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
于 2014-08-25T03:48:19.437 に答える
2

--yesterday をサポートするバージョンの date がなく、perl を使用したくない場合は、私のこの便利な ksh スクリプトを使用できます。デフォルトでは、昨日の日付が返されますが、数値を入力すると、何日も前の日付が返されます。遠い過去を見ていると、少し遅くなり始めます。100,000 日前は 1738 年 1 月 30 日でしたが、私のシステムはそれを理解するのに 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
于 2010-11-26T19:39:26.313 に答える
2

Hp-UX の場合、以下のコマンドのみが機能しました。

TZ=aaa24 日付 +%Y%m%d

次のように使用できます。

ydate=`TZ=aaa24 日付 +%Y%m%d`

$ydate をエコー

于 2013-08-07T13:53:11.013 に答える