отображение даты через определенное количество дней путем чтения числа

sudo apt-get clean

освободило достаточно места в корневом каталоге для обновления. При очистке кеша у меня было 1,3 ГБ, перескочившее до 7 ГБ.

2
01.08.2016, 14:23
1 ответ

С помощью GNU sed и GNU date:

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

Мы превращаем 2507 в 07/25, поскольку GNU date ожидает даты в стиле США. Однако обратите внимание, что 07/25 понимается как 25 июля текущего года.

Это означает, что если вы запустите эту команду 2017-01-02 на Password=x@2712, то получите 2018-01-06 (через 10 дней после 27 декабря 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')" мы получаем date для вывода текущей даты в формате d=25 m=07 y=2016. Мы берем это и оцениваем как код оболочки, чтобы установить переменные оболочки $d, $m и $y. Это лучше, чем выполнять d=$(date+%d) m=$(date+%m) y=$(date+%Y), так как выполняется только одна команда date и позволяет избежать проблемы, когда эта команда выполняется в 23:59:59.9 в последний день месяца.

Затем мы запускаем awk, при этом переменная y awk устанавливается на содержимое переменной оболочки $y (2017), а today устанавливается на -01-02.

В awk, если текущая запись соответствует регулярному выражению ^Password=.*@[0-9]{4}$. То есть если она начинается с Password= и заканчивается @, за которым следуют 4 десятичные цифры, то мы:

  • Извлекаем дату в этих последних 4 цифрах и сохраняем ее в переменной d как -mm-dd, как для today.

  • Если d лексически больше, чем today, например, в нашем примере выше -12-27 больше, чем -01-02, то мы устанавливаем d на предыдущий год (2016-12-27), и на текущий год в противном случае.

  • Затем выполняем команду date -d "2016-12-27 +10 дней" +%F. В предположении GNU date это означает печать в формате %F (то есть YYYY-MM-DD) даты, указанной 2016-12-27 +10 дней, то есть через 10 дней после 2016-12-27.

2
27.01.2020, 22:10

Теги

Похожие вопросы