Skrypt przesyła SMS-ami morskie prognozy pogody dla Chorwacji.
Wymagania:Wygląd przykładowego SMS-a z ostrzeżeniami i sytuacją baryczną:
11.08.2005:1300 WARN:Isolated
Wygląd przykładowego SMS-a z prognozą na bieżące oraz następne 12 godzin:
11.08.2005:1300 FOR12H:Se6-14,InPlacesOfNorth
Zawartość pliku weather:
#!/bin/sh
export TERM=xterm
export LYNX_TEMP_SPACE=/tmp
cd /gdziesnadysku/meteo
/usr/bin/lynx -reload -dump http://prognoza.hr/jadran_e.html > /gdziesnadysku/meteo/weather.txt
echo From: s@a.pl > /gdziesnadysku/meteo/sms
echo To: 48601123456@text.plusgsm.pl >> /gdziesnadysku/meteo/sms
/usr/bin/awk -f /gdziesnadysku/meteo/wapmeteo.awk /gdziesnadysku/meteo/weather.txt >> /gdziesnadysku/meteo/sms
echo END >> /gdziesnadysku/meteo/sms
/usr/sbin/sendmail -t < /gdziesnadysku/meteo/sms
/bin/sleep 3s
echo From: s@a.pl > /gdziesnadysku/meteo/sms12
echo To: 48601123456@text.plusgsm.pl >> /gdziesnadysku/meteo/sms12
/usr/bin/awk -f /gdziesnadysku/meteo/wapmeteo12.awk /gdziesnadysku/meteo/weather.txt >> /gdziesnadysku/meteo/sms12
echo END >> /gdziesnadysku/meteo/sms12
/usr/sbin/sendmail -t < /gdziesnadysku/meteo/sms12
rm -f /gdziesnadysku/meteo/weather.txt
rm -f /gdziesnadysku/meteo/sms
rm -f /gdziesnadysku/meteo/sms12
Zawartość pliku wapmeteo.awk:
BEGIN { RS="&"; }
{
gsub(/\r/, " ");
gsub(/\n/, " ");
gsub(/\t\t/, " ");
gsub(/\t /, " ");
gsub(/WEATHER REPORT ISSUED BY THE MARINE METEOROLOGICAL CENTER SPLIT ON /, "");
gsub(/NO WARNINGS ARE IN FORCE./," NO.");
gsub(/No warnings are in force./,"NO.");
gsub(/WEATHER FORECAST FOR THE ADRIATIC FOR THE FIRST 12 HOURS:/,"FOR 12: ");
gsub(/WEATHER FORECAST FOR THE NEXT 12 HOURS:/,"FOR NEXT 12: ");
gsub(/[Ww]ind /, "");
gsub(/PMC – Split.+/, "END");
gsub(/HOURS/,"");
gsub(/ +/, " ");
while (match($0, " *[^ ]+ *"))
{
# zapamietanie bo inne matche psuja
_rstart = RSTART;
_rlength = RLENGTH;
a = substr($0, _rstart, _rlength);
sub(/ /, "", a);
a = toupper(a);
l = length(a);
if (l>1)
{
# WEATHER -> Weather
b = substr(a, 2);
a = substr(a, 1, 1);
b = tolower(b);
a = a b;
# jezeli ostatni znak poprzedniego wyrazu to cyfra
d = substr(out, length(out), 1);
if (match(d, /[0-9]/))
{
c = substr(a, length(a), 1);
# i pierwszy znak obrabianego wyrazu to tez cyfra, to wtedy spacja
if (match(c, /[0-9]/))
{
a = " " a;
}
else if (substr(a,1,1)=="O")
{
# mala litera o po cyfrze, bo inaczej wprowadza w blad
a = "o" b;
}
}
}
out = out a;
$0 = substr($0, _rstart+_rlength);
}
$0 = out;
gsub(/\. At/, ":");
gsub(/Warning/, " WARN");
gsub(/Synopsis/, "SYNOP");
gsub(/ForNext12/, "NEXT12H");
gsub(/For12/, "FOR12H");
# gsub(/About/, "\\~");
gsub(/Temperatures/, "TEMP");
gsub(/Knots/, "KTS");
gsub(/Visibility/, "VISIB");
gsub(/The/, "");
gsub(/And/, "\\&");
gsub(/FOR12H.+/, "END");
print "Subject: " $0;
exit;
}
Zawartość pliku wapmeteo12.awk:
BEGIN { RS="&"; }
{
gsub(/\r/, " ");
gsub(/\n/, " ");
gsub(/\t\t/, " ");
gsub(/\t /, " ");
gsub(/WEATHER REPORT ISSUED BY THE MARINE METEOROLOGICAL CENTER SPLIT ON /, "");
gsub(/NO WARNINGS ARE IN FORCE./," NO.");
gsub(/No warnings are in force./,"NO.");
gsub(/WEATHER FORECAST FOR THE ADRIATIC FOR THE FIRST 12 HOURS:/,"FOR 12: ");
gsub(/WEATHER FORECAST FOR THE NEXT 12 HOURS:/,"FOR NEXT 12: ");
gsub(/[Ww]ind /, "");
gsub(/PMC – Split.+/, "END");
gsub(/HOURS/,"");
gsub(/ +/, " ");
while (match($0, " *[^ ]+ *"))
{
# zapamietanie bo inne matche psuja
_rstart = RSTART;
_rlength = RLENGTH;
a = substr($0, _rstart, _rlength);
sub(/ /, "", a);
a = toupper(a);
l = length(a);
if (l>1)
{
# WEATHER -> Weather
b = substr(a, 2);
a = substr(a, 1, 1);
b = tolower(b);
a = a b;
# jezeli ostatni znak poprzedniego wyrazu to cyfra
d = substr(out, length(out), 1);
if (match(d, /[0-9]/))
{
c = substr(a, length(a), 1);
# i pierwszy znak obrabianego wyrazu to tez cyfra, to wtedy spacja
if (match(c, /[0-9]/))
{
a = " " a;
}
else if (substr(a,1,1)=="O")
{
# mala litera o po cyfrze, bo inaczej wprowadza w blad
a = "o" b;
}
}
}
out = out a;
$0 = substr($0, _rstart+_rlength);
}
$0 = out;
gsub(/\. At/, ":");
gsub(/Warning/, " WARN");
gsub(/Synopsis/, "SYNOP");
gsub(/ForNext12/, "NEXT12H");
gsub(/For12/, "FOR12H");
# gsub(/About/, "\\~");
gsub(/Temperatures/, "TEMP");
gsub(/Knots/, "KTS");
gsub(/Visibility/, "VISIB");
gsub(/The/, "");
gsub(/And/, "\\&");
gsub(/End/, "END");
gsub(/WARN.+FOR12H/, "FOR12H");
print "Subject: " $0;
exit;
}
© Krystyna & Rafał Fitt. Jeżeli kopiujesz, to przynajmniej napisz kto to wymyślił i gdzie to znalazłeś ;-)