2017-02-19 80 views
3

wttr.in可以通过卷边wttr.in给你天气:如何从wttr.in curl结果中获得当前平均温度与bash?

curl wttr.in/Amsterdam 

我返回数据的大名单,我想用它作为TMUX段,所以我已经收窄,只是第一温度的提(这是目前的温度):

curl wttr.in/Amsterdam | grep -m 1 °C 

有时返回一个范围:

_ /"".-.  4 – 7 °C 

有时一个SINGL e温度:

_ /"".-.  13 °C 

所以前面还有一些垃圾,它有时会返回一个范围而不是单个温度。有谁知道我怎么能缩小这个总是返回一个温度(平均值,如果有两个值),没有前面的文字?

+0

只是删除所有字符,直到第一个数字已经是一个巨大的改进btw。我试着用'cut'来做,但是无法使它工作。 – vsjn3290ckjnaoij2jikndckjb

回答

4

这样做的主要困难是服务返回终端转义代码,这使得处理起来很麻烦。这就是你真正得到:

$ curl -s wttr.in/Amsterdam | grep -m 1 '°C' | cat -A 
^[[38;5;226m _ /""^[[38;5;250m.-. ^[[0m ^[[38;5;048m5^[[0m M-bM-^@M-^S ^[[38;5;046m8^[[0m M-BM-0C^[[0m  $ 

这使得这样的:

Rendered output from wttr.in

正因为如此,我们不能只提取了从第一号,因为这会由于转义序列,几乎包括整个行。

幸运的是,我们可以告诉wttr.in不给我们使用?T查询字符串参数颜色逃逸(帽尖到keheliya指出这一点):

$ curl -s wttr.in/Amsterdam?T | grep -m 1 '°C' | cat -A 
    _ /"".-.  5-8 M-BM-0C   $ 

现在我们可以从提取的一切遇到第一个数字,使用grep -o(仅保留匹配)。这也考虑到,有可能是负温度减号:

curl -s wttr.in/Amsterdam?T | grep -m 1 '°C' | grep -Eo -e '-?[[:digit:]].*' 

,或者在一个单一的grep表达式:

curl -s wttr.in/Amsterdam?T | grep -m 1 -Eo -e '-?[[:digit:]].*°C.*' 

的这个输出是

5–8 °C 

现在,如果你只想得到一个范围的平均值,你可以写出如下的函数:

cur_temp() { 
    # Get current temperature into variable 
    local cur=$(curl -s wttr.in/Amsterdam?T \ 
     | grep -m 1 -Eo -e '-?[[:digit:]].*°C.*') 

    # Check if it is a range 
    if [[ $cur == *-* ]]; then 

     # Use regex to extract temperature values 
     local re='(-?[[:digit:]])+.*-.*(-?[[:digit:]]+)' 
     [[ $cur =~ $re ]] 
     local lower=${BASH_REMATCH[1]} 
     local upper=${BASH_REMATCH[2]} 

     # Calculate average (truncates to integers) 
     cur="$(((lower + upper)/2)) °C" 
    fi 

    echo "$cur" 
} 

如果我们现在请以前返回一个范围,现在我们刚刚得到的平均值(截断为整数),因此该功能:

$ cur_temp 
6 °C 

非范围和以前一样。

这可以参数化位置,就像您从wttr.in/:bash.function获得的示例函数一样。

+1

或者,使用'curl -A“Mozilla/5.0”wttr.in/Amsterdam'并处理返回的HTML而不是终端转义序列... – jm666

+0

这太好了。我真的需要更多地学习sed和regexes。只有我添加btw的东西是'sed -e's/[[:space:]] * $ //''来修剪尾部的空格。谢谢您的帮助! – vsjn3290ckjnaoij2jikndckjb

+1

向URL追加'?T'除去了终端序列。请参阅http://wttr.in/:help获取更多信息。 – keheliya