65

I want to find the current weather of a particular city or my location from terminal. Is there any command-line weather app?

13 Answers 13

134

Simply enter the following in a terminal:

curl wttr.in

And will get your location from /etc/timezone. Otherwise curl wttr.in/your_location. For example, for Tehran:

curl wttr.in/tehran

Which gives you:

Sample output

You can also compare two cities:

diff -Naur <(curl -s http://wttr.in/london ) <(curl -s http://wttr.in/new-york )

Source code of developer is available on Github.

  • 2
    Way much better ! – Zachary Dahan May 13 '16 at 21:33
  • 2
    github.com/schachmat/wego is not bad for the devs between us – Timo Dec 10 '17 at 19:49
  • like it, but it threw an error this time: Sorry, we are running out of queries to the weather service at the moment. We will get new queries as soon as possible. – Doyousketch2 Jun 28 at 21:15
17

Search for your city at http://www.accuweather.com and replace the URL in the following script with the URL for your city:

#!/bin/sh

URL='http://www.accuweather.com/en/de/berlin/10178/weather-forecast/178087'

wget -q -O- "$URL" | awk -F\' '/acm_RecentLocationsCarousel\.push/{print $2": "$16", "$12"°" }'| head -1

Sample output:

Berlin, Germany: Foggy, 1°
  • But how do I change it to Celcius though – dat tutbrus Aug 2 '17 at 15:12
  • In the source html, I see acm_RecentLocationsCarousel.push({name:"Berlin, Germany", daypart:'day', href:'/en/de/berlin/10178/weather-forecast/178087', icon:'i-6-l', bg:'c', temp:'0', realfeel:'-6', text:"Mostly cloudy"});. Using your code, the awkfield separator is ' ' (space). Is $12 (temperature) the 12th column? – Timo Dec 10 '17 at 8:41
  • My fault, the awk separator is '. The api uses 2 numbers, the first one is the postleitzahl or zipcode. The second seems to be an api code number – Timo Dec 10 '17 at 8:51
  • 1
    Does not work anymore, has Accuweather API changed? – Timo Dec 31 '18 at 9:58
14

I have got one more way .

Open your .bashrc file and then paste this code at the bottom

weather(){ curl -s "http://api.wunderground.com/auto/wui/geo/ForecastXML/index.xml?query=${@:-<YOURZIPORLOCATION>}"|perl -ne '/<title>([^<]+)/&&printf "%s: ",$1;/<fcttext>([^<]+)/&&print $1,"\n"';}

Then save & close your .bashrc file.

now type bash to update the file.

then type

weather <location name>

for example

august@august-OEM:~$ weather guntur
December 14, 2013: Clear. High 31&amp;deg;C (87&amp;deg;F). Winds 0 kph North
December 15, 2013: Clear. High 29&amp;deg;C (84&amp;deg;F). Winds 10 kph NNW
December 16, 2013: Clear. High 31&amp;deg;C (87&amp;deg;F). Winds 10 kph North
December 17, 2013: Clear. High 29&amp;deg;C (84&amp;deg;F). Winds 7 kph ENE
December 18, 2013: Scattered Clouds. High 29&amp;deg;C (84&amp;deg;F). Winds 3 kph ENE
December 19, 2013: Scattered Clouds. High 29&amp;deg;C (84&amp;deg;F). Winds 3 kph ENE
  • 1
    Nice with weather forecast. +1 from me. – souravc Dec 15 '13 at 5:48
  • This no longer works, the last dates it shows is from May 2015 (for Cape Town, South Africa at least). Closer examination of the xml output reveals the txt_forecast parent has not been updated since May 2015 while the simpleforecast element seems to have the latest data. – Zahir J Dec 27 '16 at 22:12
  • I will update my answer – rɑːdʒɑ Dec 28 '16 at 2:06
  • Replace YOUZIPORLOCATION with $1 if you want weather <location name> to work – Ed Neville Jan 17 '18 at 20:23
  • When I replace YOUZIPORLOCATION with $1 and pass 20001 (Washington, DC zipcode), I get lines that look unformatted like Today: Mostly sunny and breezy. Highs in the upper 30s. Northwest winds 20 to 25 mph with gusts up to 45 mph. When I use "washington.dc", I get table output May 4, 2015: Clear. High 32&amp;deg;C (89&amp;deg;F). Winds 43 kph East. Any idea why the difference? – blalterman Jan 10 at 13:47
14

Here's a great semi-graphical command line utility written in Go:

https://github.com/schachmat/wego/

You'll need to install Go and setup some API stuff, but the instructions are there. Here's a sample pic:

enter image description here

  • 5
    This is being publicly hosted now - with IP address to region mapping. Try: curl -4 wttr.in – jschrab Feb 24 '16 at 21:56
  • 2
    @jschrab: And you don't need -4 actually. curl wttr.in is enough – Igor Chubin Feb 24 '16 at 22:25
  • Metric units are also available on the publicly hosted version, like so: curl wttr.in/Helsinki?m – Ville Sep 30 at 20:13
6

Try using

telnet rainmaker.wunderground.com
5

First you need to install the weather-util package, to do that just press Ctrl+Alt+T on your keyboard to open Terminal. When it opens, run the command(s) below:

sudo apt-get install weather-util

You’ll need your local weather code.

After installation you can run weather -i <code>. The code you get from the link above. For a list of available options, you can run weatherWeather info

  • 1
    it shows Last updated Dec 11, 2013 - 07:00 AM EST / 2013.12.11 1200 UTC Temperature: 86 F (30 C).is there no way to know the current weather. – Avinash Raj Dec 13 '13 at 17:13
  • Depending on your location that could be the current info that's available. – Mitch Dec 13 '13 at 17:15
  • 1
    I just tried this and discovered that it is easier to use now: weather YOURLOCATIONNAME It searches for your location then and provides possibly multiple results. From these you can read the station identifier which you can use as argument to fetch your weather informations from – Nicolas Mar 22 '16 at 23:05
  • It looks like the service it depends on has been discontinued. I just installed version 2.0, and weather LAX (which should show the weather for Los Angeles International Airport) shows a 404 error for weather.noaa.gov/pub/data/observations/metar/decoded/KNKX.TXT – Keith Thompson Aug 27 '16 at 20:08
  • 1
    That particular data file has moved from here to here. It should be possible to update the data files, changing each occurrence of http://weather.noaa.gov/pub/data to http://tgftp.nws.noaa.gov/data. UPDATE: Looks like they've already fixed it in version 2.1, which you can get from the project site. – Keith Thompson Jan 31 '17 at 3:08
5

ansiweather

AnsiWeather is a Shell script for displaying the current weather conditions in your terminal, with support for ANSI colors and Unicode symbols. Weather data comes from the OpenWeatherMap free weather API.

sudo apt-get install ansiweather
ansiweather -l London,GB -f 3
London forecast => Sat Jan 13: 7/2 °C ☔ - Sun Jan 14: 4/1 °C ☔ - Mon Jan 15: 9/6 °C ☔

https://github.com/fcambus/ansiweather

2

also a program that comes pre-installed with ubuntu called inxi will give you all types of stats on your computer and it does a weather output.

command: inxi --help

command: inxi -w

        Conditions: 82 F (28 C) - Clear Time: May 13, 10:52 AM CDT

command: inxi -wxxx

     Conditions: 82 F (28 C) - Clear Wind: From the SW at 13 MPH Humidity: 60%

       Pressure: 29.99 in (1016 mb) Heat Index: 84 F (29 C)
       Location: city (USA) Altitude: 185 m
       Time: May 13, 10:52 AM CDT (America/Chicago) Observation Time: May 13, 9:54 AM CDT
  • Seems that inxi is not part of ubuntu, as of 10.04, but can be installed with sudo apt install inxi – Starbuck Nov 28 '18 at 23:35
  • Yes, inxi is available but you need to enable the universe repository first. – mchid Mar 17 at 7:17
2

You can compare cities using:

diff -Naur <(curl -s http://wttr.in/london ) <(curl -s http://wttr.in/new-york )

as illustrated in the top-voted answer. wttr.in also makes a great "splash" screen every time you open the terminal. Do this by adding it to your ~/.bashrc file. I've done that to include Weather, Date, Time and Distribution information as detailed in this answer: How can I get this terminal splash screen?

Bash Splash in Windows 10.png

Sorry I was in Ubuntu in Windows 10 WSL for Spring 2018 updates when I captured this image. Promise I'll boot back into Ubuntu in Linux soon.

2

For even shorter weather output http://weather.tuxnet24.de provides weather data from Yahoo! in text and xml format.

The filds from the XML can then be obtained with a XML parser like xmllint i.e..

I wrote a q&d weather-fetch script, wich gets the current temperature and description of weather, then stores a unicode symbol corresponding to the description and outputs it like

☂ 6°C

I regularly update via cronjob and then use the output in my tray status.

Get your ID at yahoocom/news/weather. Change location to your desired location and look for ID in URL (i.e. if URL is yahoocom/news/weather/germany/north-rhine-westphalia/bielefeld-20066057 the ID is 20066057).

The XML contains further fields, i.e. forecast data, wind etc. – you can parse them, too, if you want.

Unfortunatly some weather symbols are not represented in the Ubuntufont… feel free to adjust.

Here's my script (replace 20066057 with your ID if you don't live in Bielefeld) - depends on bash, curl and xmllint.

#!/bin/sh
#☁☂☔❄❅❆☃ ☀☁☂⚡⚐☼

# write xml to variable
w_xml=$(curl -Ls "http://weather.tuxnet24.de/?id=20066057&mode=xml");
# get fields from xml via xmllint | xargs for trimming
# weather description
w_txt=$(xmllint --xpath "string(//current_text)" - <<<"$w_xml" | xargs);
# temperature | remove spaces from text (&#176;C prepended by space)
w_tpc=$(xmllint --xpath "string(//current_temp)"  - <<<"$w_xml" | xargs); w_tpc=${w_tpc//[[:blank:]]/};
# further fields not used atm
# w_tph=$(xmllint --xpath "string(//current_temp_high)"  - <<<"$w_xml" | xargs);
# w_tpl=$(xmllint --xpath "string(//current_temp_low)"  - <<<"$w_xml" | xargs);

# set $w_sym according to $w_txt
if   [ "$w_txt" == "Sunny" ]; then w_sym="☼";
elif [ "$w_txt" == "Mostly Sunny" ]; then w_sym="☼";
elif [ "$w_txt" == "Showers" ]; then w_sym="☂";
elif [ "$w_txt" == "Clear" ]; then w_sym="☾";
elif [ "$w_txt" == "Thunderstorms" ]; then w_sym="⚡";
elif [ "$w_txt" == "Scattered Thunderstorms" ]; then w_sym="☔";
elif [ "$w_txt" == "Isolated Thundershovers" ]; then w_sym="☔";
elif [ "$w_txt" == "Cloudy" ]; then w_sym="☁";
elif [ "$w_txt" == "Mostly Cloudy" ]; then w_sym="☁";
elif [ "$w_txt" == "Partly Cloudy" ]; then w_sym="☼☁";
elif [ "$w_txt" == "Breezy" ]; then w_sym="⚐";
# if unknown text, set text instead of symbol
else w_sym=$w_txt; 
fi
# output <symbol><space><temp-in-°C>
echo "$w_sym"" ""$w_tpc";
  • redirection unexpected error – Philip Kirkbride Feb 16 at 4:09
  • Switching shebang to #!/usr/bin/env bash fixed for me, Ubuntu 18.04 – Philip Kirkbride Feb 16 at 4:11
2

I have got one more way .

Open your .bashrc file and then paste this code at the bottom

test -f ~/.wttr.in || curl -sk wttr.in -o ~/.wttr.in
find ~ -maxdepth 1 -name .wttr.in -cmin +5 -exec curl -sk wttr.in -o ~/.wttr.in \;
head -7 ~/.wttr.in | tail -5
W(){ find ~ -maxdepth 1 -name .wttr.in -cmin +5 -exec curl -sk wttr.in -o ~/.wttr.in \;; head -27 ~/.wttr.in; }

Save & close your .bashrc file and run the following command to update bash:

. .bashrc 

then type W upper case

  • bash: W: command not found – user389450 Jan 16 '17 at 4:37
  • After edit .bashrc relogin – sergkog Dec 14 '17 at 20:38
  • You don't have to relogin if you "source" your .bashrc file. You can run: source .bashrc or you can run this instead: . .bashrc – mchid Jan 27 at 3:59
0

Although accuweather curl solution is pretty good I needed something more informational, so I created simple bash script that pulls info for next 4 hrs from weather.com website. As in previous example you have to modify link for your location.

Example output:
$ ./getWeather.sh
Temperature for 1 AM : 65&deg;F and outside should be: Partly - Cloudy FEELS LIKE:   65&deg;
Temperature for 2 AM : 65deg;F and outside should be: Partly - Cloudy FEELS LIKE: 65deg;
Temperature for 3 AM : 63deg; and outside should be: Partly - Cloudy FEELS LIKE: 63deg;
Temperature for 4 AM : 62deg; and should be: Mostly - Clear FEELS LIKE: 62deg;

Full script is located at: https://sites.google.com/site/wozoopalinux/home/wzbash001/get-weather-information-from-command-line-for-next-4-hrs

0

Meteogram of all mayor cities in the world

finger city_name@graph.no

$ finger cologne@graph.no

           -= Meteogram for germany/north_rhine-westphalia/cologne =-           
 'C                                                                   Rain
 16                                                                   
 15                           ^^^                                     
 14                  ======^^^   ^^^                                  
 13               ===               ^^^===^^^===                      
 12                                             =========             
 11            ===                                       ====--       
 10      ======                                                ---    
  9=====|                                                         --- 3 mm 
  8     |  |                                                          2 mm 
  7  |  |  |  |  |  |  |  |              |     |  |  |  |  |          1 mm 
   _08_09_10_11_12_13_14_15_16_17_18 19 20 21 22 23 00 01 02 03 04 05 Hour

    SE SE SE SE SE SW SW  W  W  W  W SW  W  W  W  W  W NW NW NW  N  N Wind dir.
     5  5  5  5  4  4  5  6  6  6  5  5  5  4  4  5  5  5  4  3  3  3 Wind(mps)

Legend left axis:   - Sunny   ^ Scattered   = Clouded   =V= Thunder   # Fog
Legend right axis:  | Rain    ! Sleet       * Snow
[Weather forecast from yr.no, delivered by the Norwegian Meteorological Institute and the NRK.]

Here is how to use it:

$ finger help@graph.no

yr.no is having technical problems, or you specified an unknown location.

Usage:

 * finger <city name>@graph.no (world weather forecast, no spaces)
   Example: finger newyork@graph.no 

 Advanced usage:

 * finger o:<city name>@graph.no (a one-line forecast)
   Example: finger o:newyork@graph.no 

 * finger ^<city name>@graph.no (Imperial units)
   Example: finger ^newyork@graph.no 

 * finger <city name>+5@graph.no (forecast from 5 hrs ahead in time (max:26))
   Example: finger northpole+5@graph.no 

 * finger <city name>~160@graph.no (set screen width)
   Example: finger southpole~160@graph.no 

 * finger <city name>%2@graph.no (forecast for every second hour [Norway])
   Example: finger oslo%2@graph.no 

 * finger <post code>@graph.no (norwegian weather forecast)
   Example: finger 0458@graph.no 

 Other: 

 * finger news@graph.no (latest headlines from NRK)
 * finger time@graph.no (server local time)
 * finger date@graph.no (server local date)
 * finger about@graph.no (contact information)

International names comes from http://fil.nrk.no/yr/viktigestader/verda.txt.

The story behind this from the developer.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.