2017-02-19 1 views
3

wttr.in wttr.inカールによってあなたに天気を与えることができます:私は、データの大規模なリストを返し、私はtmuxのセグメントとして、それを使用したいので、私はちょうど最初にそれを絞り込むましbashでwttr.in curl結果から現在の平均気温を得るには?

curl wttr.in/Amsterdam 

(現在温度)と温度の言及:SINGL時々

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

そして:時々範囲を返し

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

e温度:

したがって、まだその前にゴミがあり、温度が1つではなく範囲を返すことがあります。誰もがこれを絞り込んで、一つの温度(2つの値があれば平均)を返す方法を知っていますか?

+0

最初の数字がすでに大幅に改善されるまで、すべての文字を削除するだけです。私はカットしてやろうとしましたが、うまく動作しませんでした。 – 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

、私たちは、上の最初の数からすべてを抽出することはできませんこれは、あなた本当に得るものですエスケープシーケンスのためにほぼすべての行を含みます。

幸いなことに、我々は(アウトこれを指し示すためkeheliyaに帽子の先端)私たちに?Tクエリ文字列パラメータを使用したカラーエスケープを送信しないようにwttr.in伝えることができます:

$ 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

'?T'をURLに付加すると、端末シーケンスが取り除かれます。詳細については、http://wttr.in/:helpを参照してください。 – keheliya

関連する問題