Как извлечь подстроки и числа из результата curl, используя grep или другой метод - PullRequest
0 голосов
/ 18 февраля 2019

Это мой первый вопрос / пост, и я очень плохо знаком с регулярными выражениями.Несмотря на множество поисков и экспериментов (например, опции -o и -w), я не могу выполнить следующую работу (и я слишком смущен, чтобы публиковать все свои неудачные попытки, но см. Конец поста),Я пытаюсь получить некоторые сведения о погоде (информацию о состоянии, температуре и ветре) с веб-сайта.

Я использую следующее утверждение для извлечения соответствующей информации в текстовый файл, который я затем хочуgrep для извлечения информации.Текущая погода указана вверху, поэтому мне нужны только первые несколько строк (заголовок -n 7).Вы можете посетить сайт (https://wttr.in/[city]) и ввести [город], чтобы увидеть разнообразие результатов.

curl -s wttr.in/fargo | head -n 7> ~ / Загрузки / погода.cache

Вот проблемы / проблемы, с которыми я сталкивался:

  1. В каждой строке есть некоторый элемент «stick», который имеет цветовую кодировку.текстовый файл вместе с текстом «палочек».
  2. Текущее состояние погоды может быть одним словом (солнечно) или несколькими словами (переменная облачность). Я хочу все.
  3. Температура может бытьодно число (5 ° F), диапазон (0-15 ° F) и, конечно, возможны отрицательные числа (-10--5 ° F). Мне нужна вся информация.
  4. Направление ветра искорость (m 8 миль / ч). Опять же, скорость может быть диапазоном (5-16 миль / ч). Направление ветра - это специальный символ / символ Юникода, который я хочу запечатлеть.
  5. Я хочу назначить каждому элементу (#2-4) к своей переменной без каких-либо дополнительных вещей из строки.

Идеальные результаты из моего приведенного выше примера, который будетЯ буду использоваться в строке состояния, будет выглядеть следующим образом.

Погода = «Солнечно»

Темп = «-22--5 ° F»

Ветер = «↘ 8 миль в час »

Любая помощь будет наиболее ценной.Заранее извиняюсь за то, что я изо всех сил пытался правильно отформатировать этот пост.

Фон

Фактический вид веб-сайта приведен ниже, но без цветовой кодировки для фигурки "Солнце" и "8" (ветерскорость).Примечание: цветовая кодировка неправильна из-за программного обеспечения для публикации (и, вероятно, моего недостатка знаний).Таким образом, может быть полезно перейти на исходный сайт (https://wwtr.in/fargo).

Weather report: Fargo, United States of America

         \   /     Sunny
          .-.      -22--5 °F      
       - (   ) -   ↘ 8 mph        
          `_'      9 mi           
         /   \     0.0 in 



Curl result is below, which is being stored in the weather cache file I'm working with.

Weather report: Fargo, United States of America

 [38;5;226m    \   /    [0m Sunny
 [38;5;226m     .-.     [0m [38;5;021m-22[0m-[38;5;021m-5[0m °F[0m      
 [38;5;226m  ― (   ) ―  [0m [1m↘[0m [38;5;226m8[0m mph[0m        
 [38;5;226m     `-’     [0m 9 mi[0m           
 [38;5;226m    /   \    [0m 0.0 in[0m

===

Некоторые попытки

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

egrep --regexp='-?[[:digit:]].*°F'


  .-.      -22--5 °F

Неудачные попытки включают (также опробовал -w вариант).

    grep -m 1 -Eo -e '-?[[:digit:]].*°F'

38;5;226m     .-.      -22--5 °F

Ответы [ 2 ]

0 голосов
/ 19 февраля 2019

Было бы скучно указывать, что API позволяет скачивать другими способами?

например.различные форматы сокращений, такие как:

curl "http://wttr.in/Fargo?format=4"
curl "http://wttr.in/Fargo?format=%l:%c:%t:%w"

или html:

curl -H 'User-Agent: mozilla/compatible' http://wttr.in/Fargo

Последний услужливо вставляет логическую разметку.

Другой способ убрать экранирование ANSI:

curl -s http://wttr.in/Fargo | head -7 | colorize --clean-all

если у вас есть утилита colorize (доступна в различных дистрибутивах Linux).

0 голосов
/ 19 февраля 2019

Используйте lynx вместо curl, и вы не получите все символы форматирования:

$ lynx --dump 'https://wttr.in/fargo' | head
Weather report: Fargo, United States of America

     \   /     Sunny
      .-.      -11-1 °F
   ― (   ) ―   ↘ 8 mph
      `-’      9 mi
     /   \     0.0 in
                                                       ┌─────────────┐

┌──────────────────────────────┬───────────────────────┤  Mon 18 Feb ├────────

.

$ lynx --dump 'https://wttr.in/fargo' |
awk '
    BEGIN{ split("_ _ Weather Temp Wind",m) }
    NR>2 && NR in m{ sub(/.*  /,""); print m[NR] " = \"" $0 "\"" }
'
Weather = "Sunny"
Temp = "-11-1 °F"
Wind = "↘ 8 mph"
...