次の行を含むファイルがあります。
Password=md@2507
2507は、私が最後にパスワードを変更した日付です。このファイルのパスワード行から日付を読み、パスワードがその日付から10日後に期限切れになるので、今から10日後の日付を表示するスクリプトが必要です。
答え1
sed
GNUとGNUの使用date
:
sed -En 's#^Password=.*@([0-9]{2})([0-9]){2}$#date -d "\2/\1 +10 days" +%F#ep'
date
GNUでは、日付が米国式であると予想されるため、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
およびシェル変数を設定するために、これをシェルコードとして評価します$y
。d=$(date +%d) m=$(date +%m) y=$(date +%Y)
これは、1つのコマンドのみを実行しdate
、その月の最後の日23:59:59.9でコマンドを実行する問題を回避するため、doよりも優れています。
awk
次に、awk変数をy
シェル変数()の内容に設定し、に設定して実行します。$y
2017
today
-01-02
でawk
現在のレコードが^Password=.*@[0-9]{4}$
正規表現と一致する場合。つまり、10 進数 4 桁で始まり、Password=
終わる場合は次のようになります。@
日付の最後の4桁を抽出して
d
。-mm-dd
today
上記の例のように語彙的
d
に が より大きい場合 ( ) 前の年に設定し、そうでなければ現在の年に設定します。today
-12-27
-01-02
d
2016-12-27
date -d "2016-12-27 +10 days" +%F
次にコマンドを実行します。 GNUを想定すると、これは指定された形式(2016年12月27日以降の10日間)date
で日付を印刷することを意味します。%F
YYYY-MM-DD
2016-12-27 +10 days