Модератор: Модераторы разделов
SLEDopit
Модератор
Сообщения: 4824
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL
Сообщение
SLEDopit » 06.07.2009 10:57
недавно делать было нечего, написал скриптик для погоды.
Код:
#!/bin/bash
color(){ #окрашивает текущую температуру в зеленый цвет
tmp=$(echo -e "\033[01;32m$1\033[0m")
pre=$(echo -e "\033[01;32m$2\033[0m")
vla=$(echo -e "\033[01;32m$3\033[0m")
rain=$(echo -e "\033[01;32m$4\033[0m")
}
israin(){ #смотрит статус дождика, в стадии разработки
res=$(echo "$1"|cut -d'/' -f7|cut -d'.' -f2|sed 's/r//g')
# в разработке. нет картинок, чтоб по ним можно было различать погоду.
if [ $res -eq 0 ]; then rain=snow
elif [ $res -eq 1 ]; then rain=sunn
elif [ $res -eq 2 ]; then rain=rain
elif [ $res -eq 3 ]; then rain=suho
fi
}
get(){ #получает инфу обо всем
i=1;ch=24
while [ $i -lt 13 ]; do
((ch++))
tmp=$(echo "$we"|grep -v c0|head -$ch|tail -1|cut -d'>' -f2|cut -d'<' -f1)
if [ ${#tmp} -ne 4 ]; then tmp=$(echo " $tmp");fi
pre=$(echo "$we"|grep -v c0|head -$((ch+12))|tail -1|cut -d'>' -f2|cut -d'<' -f1)
vla=$(echo "$we"|grep -v c0|head -$((ch+24))|tail -1|cut -d'>' -f2|cut -d'<' -f1)
hour=$(date +%H)
rain=$(echo "$sourc"|grep snow|head -$(($i+2))|tail -1)
israin "$rain"
if [ $hour -lt 6 -a $i -eq 1 ]; then color $tmp $pre $vla $rain; co=0
elif [ $hour -lt 12 -a $hour -gt 5 -a $i -eq 2 ]; then color $tmp $pre $vla $rain; co=1
elif [ $hour -lt 18 -a $hour -gt 11 -a $i -eq 3 ]; then color $tmp $pre $vla $rain; co=2
elif [ $hour -lt 24 -a $hour -gt 17 -a $i -eq 4 ]; then color $tmp $pre $vla $rain; co=3
fi
rainy=$(echo -n "$rainy| $rain")
pres=$(echo -n "$pres| $pre")
tempe=$(echo -n "$tempe|$tmp")
vlazh=$(echo -n "$vlazh| $vla ")
((i++))
done
}
sourc=$(curl 'http://gismeteo.ru/city/legacy/?city=4368&shift=0&print=1' 2>/dev/null)
we=$(echo "$sourc"| grep '<td class="c'|sed 's/"//g'|grep -vE "утро|день|вечер|ночь")
date1=$(echo "$we"|head -2|tail -1|cut -d'=' -f3|cut -d' ' -f1)
date1=$(echo -e "\033[01;32m$date1\033[0m")
date2=$(echo "$we"|head -6|tail -1|cut -d'=' -f3|cut -d' ' -f1)
date3=$(echo "$we"|head -10|tail -1|cut -d'=' -f3|cut -d' ' -f1)
get
if [ $co -eq 0 ]; then dayt=$(echo -e "\033[01;32mmo\033[0m | da | ev | ni | mo | da | ev | ni | mo | da | ev | ni |")
elif [ $co -eq 1 ]; then dayt=$(echo -e "mo | \033[01;32mda\033[0m | ev | ni | mo | da | ev | ni | mo | da | ev | ni |")
elif [ $co -eq 2 ]; then dayt=$(echo -e "mo | da | \033[01;32mev\033[0m | ni | mo | da | ev | ni | mo | da | ev | ni |")
elif [ $co -eq 3 ]; then dayt=$(echo -e "mo | da | ev | \033[01;32mni\033[0m | mo | da | ev | ni | mo | da | ev | ni |")
fi
echo "---------------------------------------------------------------------------
| Date | $date1 | $date2 | $date3 |
|-------------------------------------------------------------------------|
| Daytime | $dayt
|-------------------------------------------------------------------------|
| Temperarure $tempe|
|--------------------------------------------------------------------------
| Wetness $vlazh|
|--------------------------------------------------------------------------
| Pressure $pres|
---------------------------------------------------------------------------"
вывод:
Код:
---------------------------------------------------------------------------
| Date | 2009-07-06 | 2009-07-07 | 2009-07-08 |
|-------------------------------------------------------------------------|
| Daytime | mo | da | ev | ni | mo | da | ev | ni | mo | da | ev | ni |
|-------------------------------------------------------------------------|
| Temperarure |+11°| +8°|+13°|+11°| +7°|+15°|+19°|+12°|+12°|+14°|+21°|+17°|
|--------------------------------------------------------------------------
| Wetness | 98 | 96 | 56 | 81 | 93 | 59 | 41 | 67 | 63 | 56 | 40 | 67 |
|--------------------------------------------------------------------------
| Pressure | 735| 737| 739| 740| 743| 746| 746| 746| 747| 747| 746| 744|
---------------------------------------------------------------------------
UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. © Dennis Ritchie
The more you believe you don't do mistakes, the more bugs are in your code.
butch
Сообщения: 331
ОС: :OC
Сообщение
butch » 06.07.2009 12:27
оО ого.
парсить такую страницу. а зачем7 гисметео зачем то xml больше не отдает =\
я на yahoo переехал
Вывод погоды в Conky
SLEDopit
Модератор
Сообщения: 4824
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL
Сообщение
SLEDopit » 06.07.2009 13:14
butch
так тут инфа сразу на два дня вперед. только не пойму как парсить про осадки инфу. тут только по картинке ориентироваться можно(
может другую страницу найти, чтоб парсить?)
UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. © Dennis Ritchie
The more you believe you don't do mistakes, the more bugs are in your code.
butch
Сообщения: 331
ОС: :OC
Сообщение
butch » 06.07.2009 13:30
SLEDopit писал(а): ↑ 06.07.2009 13:14
может другую страницу найти, чтоб парсить?)
верная мысль =)
еще лучше если это будет xml
pcodr
Сообщения: 283
ОС: Debian
Сообщение
pcodr » 06.07.2009 16:45
Нужно сделать чтоб не только для Москвы работало. Необходимый город передавать аргументом командной строки. В хелпе выводить все города и соответствующие им номера, которые нужно передавать параметром командной строки.
remote system type is unix
SLEDopit
Модератор
Сообщения: 4824
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL
Сообщение
SLEDopit » 06.07.2009 20:47
butch писал(а): ↑ 06.07.2009 13:30
еще лучше если это будет xml
в чем фишка иксмл?
pcodr писал(а): ↑ 06.07.2009 16:45
Нужно сделать чтоб не только для Москвы работало. Необходимый город передавать аргументом командной строки. В хелпе выводить все города и соответствующие им номера, которые нужно передавать параметром командной строки.
ок, сделаю.
UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. © Dennis Ritchie
The more you believe you don't do mistakes, the more bugs are in your code.
Farmer
Сообщения: 9
ОС: слака
Сообщение
Farmer » 06.07.2009 21:27
клевая штука спасибо
SLEDopit
Модератор
Сообщения: 4824
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL
Сообщение
SLEDopit » 06.07.2009 23:56
переехал на яндекс. добавил выбор городов. пока мало. наверно стоит сделать отдельный файл с ними, там же будет храниться дефолтный.
вот новый скрипт:
Код:
#!/bin/bash
# Weather by SLEDopit
color(){ # выделяем текущую погоду зеленым цветом
tmp=$(echo -e "\033[01;32m$1\033[0m")
pre=$(echo -e "\033[01;32m$2\033[0m")
vla=$(echo -e "\033[01;32m$3\033[0m")
rai=$(echo -e "\033[01;32m$4\033[0m")
}
calc_temp(){ # вычисляем среднюю температуру и добавляем символ градуса
low=$(echo $1|sed 's/…/./g'|cut -d'.' -f1)
up=$(echo $1|sed 's/…/./g'|cut -d'.' -f2)
tmp=$(((low+up)/2))
if [ $tmp -gt 0 ]; then tmp=$(echo "+$tmp");fi
tmp=$(echo "$tmp°")
}
parse(){ # парсим данные
name=$(mktemp /tmp/weather_XXXXXX)
touch $name
i=1;while [ $i -lt 13 ]; do
((ch++))
tmp=$(echo "$we"|grep '"t"'|grep -v th|head -$i|tail -1|cut -d'>' -f5|cut -d'<' -f1)
calc_temp $tmp
pre=$(echo "$we"|grep press|grep -v th|head -$i|tail -1|cut -d'>' -f2|cut -d'<' -f1)
vla=$(echo "$we"|grep moist|grep -v th|head -$i|tail -1|cut -d'>' -f2|cut -d'<' -f1)
rai=$(echo "$we"|grep data|grep -v th|head -$i|tail -1|cut -d'>' -f2|cut -d'<' -f1)
rai=$(echo $rai"test")
if [ "$(cat $name|grep "$rai")" ]; then
rai=$(cat -n $name|grep "$rai"|awk '{print $1}')
((g++))
else
echo $rai>>$name
rai=$(cat -n $name|grep "$rai"|awk '{print $1}')
fi
#check $rai
hour=$(date +%H)
if [ ${#tmp} -eq 3 ]; then tmp=$(echo " $tmp");fi
if [ $hour -lt 6 -a $i -eq 1 ]; then color "$tmp" $pre $vla "$rai"; co=0
elif [ $hour -lt 12 -a $hour -gt 5 -a $i -eq 2 ]; then color "$tmp" $pre $vla "$rai"; co=1
elif [ $hour -lt 18 -a $hour -gt 11 -a $i -eq 3 ]; then color "$tmp" $pre $vla "$rai"; co=2
elif [ $hour -lt 24 -a $hour -gt 17 -a $i -eq 4 ]; then color "$tmp" $pre $vla "$rai"; co=3
fi
rainy=$(echo -n "$rainy| $rai ")
press=$(echo -n "$press| $pre")
tempe=$(echo -n "$tempe|$tmp")
vlazh=$(echo -n "$vlazh| $vla")
((i++))
done
}
dat(){ # парсим дату. требуется добавить подгонку длины, чтобы таблица не раползалась.
num=$(echo -n "$we"|grep rowspan|head -$1|tail -1|cut -d'>' -f3|cut -d'<' -f1)
mon=$(echo "$we"|grep rowspan|head -$1|tail -1|cut -d'>' -f5|cut -d'<' -f1)
}
main(){ # так сказать ядро. получаем и выводим погоду.
we=$(curl "http://weather.yandex.ru/$city/details/" 2>/dev/null|grep -E 'dat|pre|mois|class="t"')
d=1
while [ $d -lt 4 ]; do
dat $d
date[$d]=$(echo "$num $mon")
((d++))
done
date[1]=$(echo -e "\033[01;32m${date[1]}\033[0m")
parse
tim=$(echo "утро|день|вече|ночь|утро|день|вече|ночь|")
if [ $co -eq 0 ]; then dayt=$(echo -e "\033[01;32mутро\033[0m|день|вече|ночь|$tim")
elif [ $co -eq 1 ]; then dayt=$(echo -e "утро|\033[01;32mдень\033[0m|вече|ночь|$tim")
elif [ $co -eq 2 ]; then dayt=$(echo -e "утро|день|\033[01;32mвече\033[0m|ночь|$tim")
elif [ $co -eq 3 ]; then dayt=$(echo -e "утро|день|вече|\033[01;32mночь\033[0m|$tim")
fi
min="-------------------------------------------------------------------------"
echo "-$min-
| Дата | ${date[1]} | ${date[2]} | ${date[3]} |
|$min|
| Время суток |$dayt
|$min|
| Температура $tempe|
|$min|
| Влажность $vlazh|
|$min|
| Давление $press|
|$min|
| Осадки $rainy|
|$min|
$(cat -n $name|sed s/test//g|sed 's/^/|/g')
-$min-"
rm $name
}
case "$1" in
msc)
city=27612
main
;;
stp)
city=26063
main
;;
nn)
city=27459
main
;;
vi)
city=27503
main
;;
vv)
city=31960
main
;;
kz)
city=27595
main
;;
sa)
city=28807
main
;;
nsk)
city=29634
main
;;
kr)
city=34929
main
;;
*)
echo "Usage: $0 city
Cities list:
kr - Krasnodar
kz - Kazan
msc - Moscow
nn - Nizhniy Novgorod
nsk - Novisibirsk
sa - Samara
stp - Saint Peterspurg
vi - Vidnoe
vv - Vladivostok" >&2
exit 3
;;
esac
пример вывода:
Код:
---------------------------------------------------------------------------
| Дата | 6 июля | 7 июля | 8 июля |
|-------------------------------------------------------------------------|
| Время суток |утро|день|вече|ночь|утро|день|вече|ночь|утро|день|вече|ночь|
|-------------------------------------------------------------------------|
| Температура |+10°|+12°|+11°| +9°|+14°|+19°|+17°|+14°|+17°|+22°|+20°|+17°|
|-------------------------------------------------------------------------|
| Влажность | 88%| 72%| 93%| 81%| 49%| 46%| 61%| 75%| 57%| 65%| 83%| 94%|
|-------------------------------------------------------------------------|
| Давление | 737| 739| 741| 745| 746| 746| 747| 747| 746| 745| 745| 743|
|-------------------------------------------------------------------------|
| Осадки | 1 | 1 | 2 | 2 | 1 | 3 | 3 | 1 | 3 | 1 | 1 | 1 |
|-------------------------------------------------------------------------|
| 1 переменная облачность, небольшой дождь
| 2 ясно
| 3 переменная облачность
---------------------------------------------------------------------------
UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. © Dennis Ritchie
The more you believe you don't do mistakes, the more bugs are in your code.
anazar
Сообщения: 19
ОС: Debian 5.0
Сообщение
anazar » 07.07.2009 01:09
что-то как-то не работает
$ ./whether msc
---------------------------------------------------------------------------
| Дата | | | |
|-------------------------------------------------------------------------|
| Время суток |утро|день|вече|ночь|утро|день|вече|ночь|утро|день|вече|ночь|
|-------------------------------------------------------------------------|
| Температура |0°|0°|0°|0°|0°|0°|0°|0°|0°|0°|0°|0°|
|-------------------------------------------------------------------------|
| Влажность | | | | | | | | | | | | |
|-------------------------------------------------------------------------|
| Давление | 1| | | | | | | | | | | |
|-------------------------------------------------------------------------|
| Осадки | | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
|-------------------------------------------------------------------------|
| 1
---------------------------------------------------------------------------
SLEDopit
Модератор
Сообщения: 4824
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL
Сообщение
SLEDopit » 07.07.2009 08:58
anazar
а в системе установлен curl?
UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. © Dennis Ritchie
The more you believe you don't do mistakes, the more bugs are in your code.
anazar
Сообщения: 19
ОС: Debian 5.0
Сообщение
anazar » 07.07.2009 13:27
ага, спасибо
SLEDopit
Модератор
Сообщения: 4824
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL
Сообщение
SLEDopit » 07.07.2009 13:45
butch
ладно убедили. пойду искать где нить выдачу xml на 3 дня.
UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. © Dennis Ritchie
The more you believe you don't do mistakes, the more bugs are in your code.
Portnov
Модератор
Сообщения: 1786
Статус: Матёрый линуксоид
ОС: Debian testing/unstable
Сообщение
Portnov » 07.07.2009 14:58
А то что оно на шелле - это фишка такая? :)
SLEDopit
Модератор
Сообщения: 4824
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL
Сообщение
SLEDopit » 07.07.2009 19:12
Portnov писал(а): ↑ 07.07.2009 14:58
А то что оно на шелле - это фишка такая? :)
так специально делал, чтоб именно из консоли погоду узнавать. или на чем то другом в моем случае нужно делать?
UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. © Dennis Ritchie
The more you believe you don't do mistakes, the more bugs are in your code.
Portnov
Модератор
Сообщения: 1786
Статус: Матёрый линуксоид
ОС: Debian testing/unstable
Сообщение
Portnov » 07.07.2009 20:13
Ну там python, perl, да всё что угодно. Решение на баше выглядит какой-то шуткой :)
SLEDopit
Модератор
Сообщения: 4824
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL
Сообщение
SLEDopit » 08.07.2009 18:32
Portnov писал(а): ↑ 07.07.2009 20:13
Ну там python, perl, да всё что угодно.
ни то, ни другое не знаю =)
Portnov писал(а): ↑ 07.07.2009 20:13
Решение на баше выглядит какой-то шуткой :)
почему?
UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. © Dennis Ritchie
The more you believe you don't do mistakes, the more bugs are in your code.
butch
Сообщения: 331
ОС: :OC
Сообщение
butch » 09.07.2009 10:00
большой опытный дядька стебается, не видишь чтоле? =-)
но вообще я плохо вижу ситуации использования скрипта
Portnov
Модератор
Сообщения: 1786
Статус: Матёрый линуксоид
ОС: Debian testing/unstable
Сообщение
Portnov » 09.07.2009 23:40
Да нет, просто шелл как язык не приспособлен к парсингу хтмл и подобным задачам. К этим задачам его можно применить, как показал топикстартер, но программа получается большая и, главное - трудно поддерживаемая. На более приспособленных языках получится короче, и изменять потом программу будет легче.
Почему шуткой - недавно где-то читал, в одной конторе живёт и работает шелл-скрипт на несколько тысяч строк, занимается обсчётом потреблённого трафика и чем-то таким ещё. И никто не понимает, как он работает. Т.е. когда-то задача у автора этого скрипта была относительно простая, и он решил её на шелле. Потом требования к программе росли, и он вовремя не удосужился переписать её на чём-нибудь другом, а потом было поздно - переписывать с нуля такую программу нереально долго. Довольно поучительная история, имхо ;)
SLEDopit
Модератор
Сообщения: 4824
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL
Сообщение
SLEDopit » 09.07.2009 23:56
Portnov
все, доосвою курс баш скриптинга и пойду осваивать перл или питон скриптинг =)
UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. © Dennis Ritchie
The more you believe you don't do mistakes, the more bugs are in your code.