погода из консоли (покритикуйте)

Модератор: Модераторы разделов

Аватара пользователя
SLEDopit
Модератор
Сообщения: 4824
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL

погода из консоли

Сообщение SLEDopit »

недавно делать было нечего, написал скриптик для погоды.

Код:

#!/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

Re: погода из консоли

Сообщение butch »

оО ого.
парсить такую страницу. а зачем7 гисметео зачем то xml больше не отдает =\
я на yahoo переехал Вывод погоды в Conky
Спасибо сказали:
Аватара пользователя
SLEDopit
Модератор
Сообщения: 4824
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL

Re: погода из консоли

Сообщение SLEDopit »

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

Re: погода из консоли

Сообщение butch »

SLEDopit писал(а):
06.07.2009 13:14
может другую страницу найти, чтоб парсить?)

верная мысль =)
еще лучше если это будет xml
Спасибо сказали:
pcodr
Сообщения: 283
ОС: Debian

Re: погода из консоли

Сообщение pcodr »

Нужно сделать чтоб не только для Москвы работало. Необходимый город передавать аргументом командной строки. В хелпе выводить все города и соответствующие им номера, которые нужно передавать параметром командной строки.
remote system type is unix
Спасибо сказали:
Аватара пользователя
SLEDopit
Модератор
Сообщения: 4824
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL

Re: погода из консоли

Сообщение SLEDopit »

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
ОС: слака

Re: погода из консоли

Сообщение Farmer »

клевая штука спасибо
Спасибо сказали:
Аватара пользователя
SLEDopit
Модератор
Сообщения: 4824
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL

Re: погода из консоли

Сообщение SLEDopit »

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

Код:

#!/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

Re: погода из консоли

Сообщение anazar »

что-то как-то не работает :(
$ ./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

Re: погода из консоли

Сообщение SLEDopit »

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.
Спасибо сказали:
Аватара пользователя
butch
Сообщения: 331
ОС: :OC

Re: погода из консоли

Сообщение butch »

SLEDopit, вы уж извините меня, но парсить это: http://weather.yandex.ru/27595/details помоему маразм =)
спросите почему? да просто потому что дизайн хтмлки может изменится.
парсить нада что то в этом духе: http://weather.yahooapis.com/forecastrss?p=RSXX0043&u=c
но вообще вы кнчно молодец. просто парсите не то =)
Спасибо сказали:
anazar
Сообщения: 19
ОС: Debian 5.0

Re: погода из консоли

Сообщение anazar »

SLEDopit писал(а):
07.07.2009 08:58
anazar
а в системе установлен curl?

ага, спасибо :)
Спасибо сказали:
Аватара пользователя
SLEDopit
Модератор
Сообщения: 4824
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL

Re: погода из консоли

Сообщение SLEDopit »

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

Re: погода из консоли

Сообщение Portnov »

А то что оно на шелле - это фишка такая? :)
Работа: Ubuntu 9.10
Дом: Debian testing/unstable и на всякий случай winxp в virtualbox.
Для разнообразия: моя домашняя страница -http://iportnov.ru
Спасибо сказали:
Аватара пользователя
SLEDopit
Модератор
Сообщения: 4824
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL

Re: погода из консоли

Сообщение SLEDopit »

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

Re: погода из консоли

Сообщение Portnov »

Ну там python, perl, да всё что угодно. Решение на баше выглядит какой-то шуткой :)
Работа: Ubuntu 9.10
Дом: Debian testing/unstable и на всякий случай winxp в virtualbox.
Для разнообразия: моя домашняя страница -http://iportnov.ru
Спасибо сказали:
Аватара пользователя
SLEDopit
Модератор
Сообщения: 4824
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL

Re: погода из консоли

Сообщение SLEDopit »

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

Re: погода из консоли

Сообщение butch »

SLEDopit писал(а):
08.07.2009 18:32
почему?

большой опытный дядька стебается, не видишь чтоле? =-)
но вообще я плохо вижу ситуации использования скрипта
Спасибо сказали:
Аватара пользователя
Portnov
Модератор
Сообщения: 1786
Статус: Матёрый линуксоид
ОС: Debian testing/unstable

Re: погода из консоли

Сообщение Portnov »

Да нет, просто шелл как язык не приспособлен к парсингу хтмл и подобным задачам. К этим задачам его можно применить, как показал топикстартер, но программа получается большая и, главное - трудно поддерживаемая. На более приспособленных языках получится короче, и изменять потом программу будет легче.

Почему шуткой - недавно где-то читал, в одной конторе живёт и работает шелл-скрипт на несколько тысяч строк, занимается обсчётом потреблённого трафика и чем-то таким ещё. И никто не понимает, как он работает. Т.е. когда-то задача у автора этого скрипта была относительно простая, и он решил её на шелле. Потом требования к программе росли, и он вовремя не удосужился переписать её на чём-нибудь другом, а потом было поздно - переписывать с нуля такую программу нереально долго. Довольно поучительная история, имхо ;)
Работа: Ubuntu 9.10
Дом: Debian testing/unstable и на всякий случай winxp в virtualbox.
Для разнообразия: моя домашняя страница -http://iportnov.ru
Спасибо сказали:
Аватара пользователя
SLEDopit
Модератор
Сообщения: 4824
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL

Re: погода из консоли

Сообщение SLEDopit »

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.
Спасибо сказали: