2017-02-19 3 views
3

wttr.in은 wttr.in 컬링에 의해 당신에게 날씨를 제공 할 수 있습니다 :bash를 사용하여 wttr.in curl 결과에서 현재 평균 온도를 얻는 방법은 무엇입니까?

curl wttr.in/Amsterdam 

내가 큰 데이터 목록을 반환하고 나는 TMUX 세그먼트로 사용하려는, 그래서 난 그냥 처음에 그것을 좁혀했습니다 (현재 온도가) 온도의 언급하십시오 자장하게 때로는

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

그리고 : 때때로 범위를 반환

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

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

그 것 때문에, 우리는 단지에 첫 번째 숫자에 이르기까지 모든 것을 추출 할 수 없기 때문에 이스케이프 시퀀스로 인해 거의 전체 라인을 포함합니다.

다행히도, 우리는 (교체 아웃이 포인팅을위한 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:]].*' 

또는 :

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" 
} 
01 23,516,

우리가 이전에 지금 우리가 (정수로 절단) 평균 얻을 범위를 반환 결과에이 함수를 호출하는 경우 :

$ 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