Високосный год - экстраполяционное значение

Необходимо смочь видеть от вывода wget --spider ... почему wget перестал работать. Та информация посылается по электронной почте пользователю, запускающему скрипт или, если Вы используете

MAILTO=your.email@address.com

можно перенаправить его к почтовому ящику для обзора.

Если существует побочная сеть или ошибки DNS, можно сделать двойную проверку, чтобы видеть, была ли недоступность временной, и таким образом сокращение количества ложных положительных сторон:

wget --spider -a /var/tmp/wget_test.log http://mywebsite.com || (sleep 10; wget --spider http://mywebsite.com ) || php sendsms.php

Обратите внимание, что я сделал первую попытку, добавьте вывод к файлу журнала (вместо того, чтобы печатать к stderr). Таким образом, Вы не получаете электронное письмо каждые 10 минут, если вещи хорошо работают.

Каждый wget выполненная первая печать метка времени даты и URL, когда это пробует тот URL. Вы сможете рассмотреть все выполнения, которые приводят первое к сбою wget и передайте второе путем соответствия метке времени даты от отправленного по электронной почте вывода второго wget к этому от файла журнала.

4
20.10.2015, 19:51
3 ответа

Может быть что-то вроде:

awk '
  function isleap(y) {
    return y % 4 == 0 && (y % 100 != 0 || y % 400 == 0)
  }
  $2 == 3 && $3 == 1 && isleap($1) && last_day != 29 {
    print $1, 2, 29, (last_data + $4) / 2
  }
  {print; last_day = $3; last_data = $4}' file
4
27.01.2020, 20:50

Я как раз думал об этом, и из-за того, что високосные годы чередуются с каждым другим четным годом, верно следующее:

([13579][26]|[02468][048]) == leap year

В основном, високосные годы возникают в годы 2 и 6 для нечетных десятилетий, но в годы 4 и 8 для десятилетий с четными номерами и на рубеже каждого второго десятилетия.

Итак, вы можете сделать:

sed -e'  /[02468] * 2 * 28 /!b'\
    -e'h;/[13579][26] * 2 / G' \
    -e'  /[02468][048] * 2 /G' \
    -e'  /\n/s/ 28 / 29 /2'    \
    -eP\;D <in >out

... который найдет, удвоит, а затем изменит все входные строки 28 февраля только для високосных лет, независимо от начальной точки для любого цикла чередования.


Это был мой первый инстинкт:

sed -e'/\([02648] * 2 * 2\)8 /!b' \
    -e:n -e'n;//!bn' -e'p;s//\19 /' <in

... который был лишь небольшой адаптацией к моему ответу на ваш другой вопрос , но который будет работать только для каждой серии, в которой встречается первый четный год. не високосный, потому что работает поочередно.

Я протестировал оба sed с моим тестовым файлом из вашего другого вопроса . У infile, конечно, уже были високосные годы, и код, который я использовал для его генерации, тоже есть в ответе, но оба работали для серии, начинающейся с 1970 года, хотя первый все равно не сломался:


1970  2   27  58
1970  2   28  59
1970  3   1   60
1972  2   27  58
1972  2   28  59
1972  2   29  59
1972  2   29  60
1972  3   1   61
1974  2   27  58
1974  2   28  59
1974  3   1   60
1976  2   27  58
1976  2   28  59
1976  2   29  59
1976  2   29  60
1976  3   1   61
1978  2   27  58
1978  2   28  59
1978  3   1   60
1980  2   27  58
1980  2   28  59
1980  2   29  59
1980  2   29  60
1980  3   1   61
2
27.01.2020, 20:50

Решение Perl:

#!/usr/bin/perl
use warnings;
use strict;

use Time::Piece;

print scalar <>; # Skip the header.

while (<>) {
    my ($year, $month, $day, $res) = split;
    my $t = 'Time::Piece'->strptime("$year $month $day", '%Y %m %d');
    if ($t->is_leap_year && 2 == $month && 28 == $day) {
        print;
        $_ = <>;
        my ($year2, $month2, $day2, $res2) = split;
        die "Expected March the 1st: $_"
            unless $year == $year2 && 3 == $month2 && 1 == $day2;
        print join("\t", $year, 2, 29, ($res + $res2) / 2), "\n";
    }
    print;
}

Сохранить как fix_feb29.pl . Затем запустите

for file in *.txt ; do
    fix_feb29.pl -i~ "$file"
done
1
27.01.2020, 20:50

Теги

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