숫자를 읽어 특정 일수 이후의 날짜를 표시합니다.

숫자를 읽어 특정 일수 이후의 날짜를 표시합니다.

다음 줄이 포함된 파일이 있습니다.

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및 쉘 변수를 설정하기 위해 이를 쉘 코드로 평가합니다 $y. d=$(date +%d) m=$(date +%m) y=$(date +%Y)이는 하나의 명령만 실행 date하고 해당 월의 마지막 날 23:59:59.9에 명령을 실행하는 문제를 방지하므로 do보다 낫습니다 .

awk그런 다음 awk 변수를 y쉘 변수( )의 내용으로 설정하고 로 설정하여 실행합니다 .$y2017today-01-02

에서 awk현재 레코드가 ^Password=.*@[0-9]{4}$정규식과 일치하는 경우. 즉, 십진수 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

관련 정보