다음 줄이 포함된 파일이 있습니다.
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)
이는 하나의 명령만 실행 date
하고 해당 월의 마지막 날 23:59:59.9에 명령을 실행하는 문제를 방지하므로 do보다 낫습니다 .
awk
그런 다음 awk 변수를 y
쉘 변수( )의 내용으로 설정하고 로 설정하여 실행합니다 .$y
2017
today
-01-02
에서 awk
현재 레코드가 ^Password=.*@[0-9]{4}$
정규식과 일치하는 경우. 즉, 십진수 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