数字を読み、特定の日数以降の日付を表示します。

数字を読み、特定の日数以降の日付を表示します。

次の行を含むファイルがあります。

Password=md@2507

2507は、私が最後にパスワードを変更した日付です。このファイルのパスワード行から日付を読み、パスワードがその日付から10日後に期限切れになるので、今から10日後の日付を表示するスクリプトが必要です。

答え1

sedGNUとGNUの使用date

sed -En 's#^Password=.*@([0-9]{2})([0-9]){2}$#date -d "\2/\1 +10 days" +%F#ep'

dateGNUでは、日付が米国式であると予想されるため、2507を07/25に変更しました。しかし、07/25は7月25日と理解されることに注意してください。今年

つまり、2017年1月2日に入力に対してPassword=x@2712コマンドを実行すると、2018-01-06出力が得られます(12月27日から10日後)。2017年)。

あなたができることは次のとおりです。

eval "$(date +'d=%d m=%m y=%Y')"
awk -v "y=$y" -v "today=-$m-$d" -F @ '
  /^Password=.*@[0-9]{4}$/ {
    d = "-" substr($NF, 3) "-" substr($NF, 1, 2)
    d = (d > today ? y - 1 : y) d
    system("date -d \"" d " +10 days\" +%F");
  }'

では、eval "$(date +'d=%d m=%m y=%Y')"現在の日付を出力する日付形式を取得しますd=25 m=07 y=2016$d$mおよびシェル変数を設定するために、これをシェルコードとして評価します$yd=$(date +%d) m=$(date +%m) y=$(date +%Y)これは、1つのコマンドのみを実行しdate、その月の最後の日23:59:59.9でコマンドを実行する問題を回避するため、doよりも優れています。

awk次に、awk変数をyシェル変数()の内容に設定し、に設定して実行します。$y2017today-01-02

awk現在のレコードが^Password=.*@[0-9]{4}$正規表現と一致する場合。つまり、10 進数 4 桁で始まり、Password=終わる場合は次のようになります。@

  • 日付の最後の4桁を抽出してd-mm-ddtoday

  • 上記の例のように語彙的dに が より大きい場合 ( ) 前の年に設定し、そうでなければ現在の年に設定します。today-12-27-01-02d2016-12-27

  • date -d "2016-12-27 +10 days" +%F次にコマンドを実行します。 GNUを想定すると、これは指定された形式(2016年12月27日以降の10日間)dateで日付を印刷することを意味します。%FYYYY-MM-DD2016-12-27 +10 days

関連情報