LINUX.ORG.RU

[Bash] Справошная.

 


0

1

Вот скрипт, который выдает информацию о погоде и курсе валют, по отношению к рублю.

#!/bin/bash
a="lynx -dump http://www.yandex.ru/"
echo -e "\n## Курсы валют ##\nEUR "`exec $a | awk /EUR/'{print $3}'`"\nUSD "`exec $a | awk /USD/'{print $3}'`"\n"
b="lynx -dump http://pogoda.yandex.ru/moscow/"
echo -ne "## Погода ##\nТемпература: "`exec $b | sed '{/°C/!d; s/\   //;q}'`", "
exec $b | egrep '(Облачно|Ясно|Малооблачно|Переменная)' | sed '{s/\  //g}'
exec $b | sed '{/Ветер/!d; s/\   //;q}'
exec $b | sed '{/Давление/!d; s/\   //;q}'
exec $b | sed '{/Влажность/!d; s/\   //;q}'
Вопрос: достаточно ли скрипт оптимизирован? Можно ли однотипные действия с sed записать компактнее, возможно, в одну строку? И второй вопрос: не надумал, как лучше распарсить строку с состоянием погоды, то есть облачно ли на улице или ясно. Вроде строка egrep '(Облачно|Ясно|Малооблачно|Переменная)' охватывает все возможные состояния погоды. Подавайте свежие идеи.



Последнее исправление: tsya (всего исправлений: 3)

А не факт что один сложный вызов лучше нескольких простых. (это про сид)

Основная фигня вот

b="lynx -dump http://pogoda.yandex.ru/volgograd/" 
И вызов этого 5 раз.) Получи один раз, cохрани в переменной/файле и работай с уже полученным, а не дёргай постоянно.

nitz ★★
()
Ответ на: комментарий от nitz

> Получи один раз, cохрани в переменной/файле и работай с уже полученным

Я так и сделал. Больше никак не получится.

tsya
() автор топика

Обычно вместо чтения вывода lynx -dump парсят саму страницу:

wget -qO- "http://www.yandex.ru/sl/stocks.html" | sed -r 's/.*USD[^0-9,]+([0-9,]+).*EUR[^0-9,]+([0-9,]+).*/USD \1\nEUR \2\n/'
wget -qO- "http://pogoda.yandex.ru/volgograd/" | perl -M5.010 -ne 'say $1 if /(Облачно|Ясно|Малооблачно|Переменная)/;say $1 if /(Ветер[^<]+)/;say $1 if /(Давление[^<]+)/;say $1 if /(Влажность[^<]+)/;'

AITap ★★★★★
()
Ответ на: комментарий от tsya

Стараюсь обойтись sed и awk, но тут мне понадобилась конструкция вида «напечатать match, если regexp подошёл».

Кстати, это делается даже проще:

wget -qO- "http://pogoda.yandex.ru/volgograd/" | egrep -o -e 'Облачно|Ясно|Малооблачно|Переменная' -e '(Ветер|Давление|Влажность)[^<]+'

AITap ★★★★★
()
Ответ на: комментарий от tsya

Парсишь дерево xml через sed. хтмл могут вертеть как вздумается, а в xml дереве заранее оговоренные поля, которые не меняются, а данные можно потом выпротрашивать, на чём бы они ни были, хоть на хангыле.

Deleted
()
Ответ на: комментарий от tsya

Тогда так:

wget -qO- "http://pogoda.yandex.ru/volgograd/" | egrep -o -e 'Облачно|Ясно|Малооблачно|Переменная' -e '(Ветер|Давление|Влажность)[^<]+' -e '[+-][0-9]+ °C'
Если слово «Температура» обязательно, придётся всё выражение переписывать на sed.

AITap ★★★★★
()
Ответ на: комментарий от AITap

У меня ясно через запятую после градусов.

tsya
() автор топика
Ответ на: комментарий от AITap

Так пойдет?

#!/bin/bash
echo "## Курсы валют ##"
wget -qO- "http://www.yandex.ru/sl/stocks.html" | sed -r 's/.*USD[^0-9,]+([0-9,]+).*EUR[^0-9,]+([0-9,]+).*/USD \1\nEUR \2\n/'
echo -ne "\n## Погода ##\nТемпература" `wget -qO- "http://pogoda.yandex.ru/volgograd/" | egrep -o -e '[+-][0-9]+ °C'`", "
wget -qO- "http://pogoda.yandex.ru/volgograd/" | egrep -o -e 'Облачно|Ясно|Малооблачно|Переменная' -e '(Ветер|Давление|Влажность)[^<]+'

tsya
() автор топика
Ответ на: комментарий от AITap

Как подобное:

 egrep '(Облачно|Ясно|Малооблачно|Переменная)'
Можно записать на sed?

tsya
() автор топика

если это текущая погода, то лучше вообще брать инфу по METAR коду. для волгограда это будет UURW. соответственно запрос будет выглядеть как-то так:

silwer@archmage $ weather -i urww
Current conditions at Volgograd, Russia (URWW) 48-47N 044-22E 134M (URWW)
Last updated Oct 25, 2011 - 02:30 PM EDT / 2011.10.25 1830 UTC
   Temperature: 35 F (2 C)
   Relative Humidity: 64%
   Wind: from the NNW (340 degrees) at 9 MPH (8 KT)

или вообще напрямую качать http://weather.noaa.gov/pub/data/observations/metar/decoded/URWW.TXT

Там точно ничего в формате не поменяется.

silw ★★★★★
()
Ответ на: комментарий от tsya

>> Зачем запрашивать одну и ту же страницу четыре раза?

Ну и напиши, как лучше.

Сначала ответь на вопрос, а потом проси об одолжении.

Deleted
()
Ответ на: комментарий от tsya

Здесь нет и не было ни какого троллизма, троллинга и нападок. Просто ответь на простой вопрос. Если ты пишешь приложение, которое парсит страницу, которую можно просто запросить в любом браузере, значит ты хотел избавиться от лишнего декора и прочей шелухи. Когда это может быть нужно? Да, правильно — тогда, когда дорогой трафик и (или) медленное соединение. И что же ты делаешь? — Запрашиваешь страницу 4 лишних раза.

Ещё раз вопрос: зачем?

Deleted
()
Ответ на: комментарий от tsya

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

silw ★★★★★
()
Ответ на: комментарий от silw

Я живу не в центре города, а на окраине, которая ближе всего в аэропорту. Он входит в район, в котором я живу.

tsya
() автор топика
Ответ на: комментарий от silw

> что ты можешь получить какой-нить дешевенькой погодной станцией.

На Яндексе сводка о погоде говно?

tsya
() автор топика
Ответ на: комментарий от silw

http://help.yandex.ru/pogoda/

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

tsya
() автор топика
Ответ на: комментарий от silw

Посмотри с увеличением Клац! - шоссе Авиаторов. Наверное, метеостанция находится на территории аэропорта. Само здание аэропорта № 161.

tsya
() автор топика
Ответ на: комментарий от tsya

я вообще-то про яндекс спрашивал. По приведенной выше ссылке, ни нашел ни одного явного отсылка к карте с указанием метеостанций. Зато там написано, что данные предоставлены Foreca, например. Не лучше ли тогда получать данные из первоисточника?

А про METAR, повторюсь, википедия в помощь

silw ★★★★★
()

Можно ли однотипные действия с sed записать компактнее, возможно, в одну строку?

Зачем в одну? Лучше вызовы минимизируй, чтобы процессы форкал реже

lynx -dump http://www.yandex.ru |
    awk '
        BEGIN {print "\n## Курсы валют ##"}
        /EUR/ {print "EUR " $3}
        /USD/ {print "USD " $3}
    '

lynx -dump http://pogoda.yandex.ru/moscow/ |
    sed -nr '
        s/\s+//
        /°C/ s/^/Температура: /p
        /(Облачно|Ясно|Малооблачно|Переменная)/p
        /Ветер/p
        /Давление/p
        /Влажность/p
    '
anonymous
()

первая оптимизация - man bash на предмет, что такое exec

в твоем скрипте выполнится только первый exec $b ...

ananas ★★★★★
()

1. wget вместо lynx. ну нет у меня lynx. больше устраивает links. а wget должен быть, по идее. 2. два запроса с сохранением во временные файлы.

taker
()
Ответ на: комментарий от tsya

Такая база есть, внезапно. Пример можно посмотреть у них. Вполне себе реальная база данных перелетов граждан за 5-7 года.

silw ★★★★★
()
Ответ на: комментарий от tsya

ну так база вполне официальная, просто слитая кем-то в свободный доступ.

silw ★★★★★
()

Будешь нормально себя вести и не генерировать тупак - не нужны будут прокси и тор.

Deleted
()
Ответ на: комментарий от ananas

> в твоем скрипте выполнится только первый exec $b ...

Акела промахнулся: перед созданием пайпа bash форкнется

anonymous
()
Ответ на: комментарий от anonymous

> перед созданием пайпа bash форкнется

да, холоднул

ananas ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.