89

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

15 Answers 15

187

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.

8
  • 2
    Way much better ! May 13, 2016 at 21:33
  • 2
    github.com/schachmat/wego is not bad for the devs between us
    – Timo
    Dec 10, 2017 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. Jun 28, 2019 at 21:15
  • This no longer works - last response was "Follow @igor_chubin for wttr.in updates" Dec 4, 2020 at 18:33
  • One word: Nifty! @NightOwlPrgmr For me this works fine as of 2021-05-31.
    – stephanmg
    May 31, 2021 at 7:39
20

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°
4
  • But how do I change it to Celcius though Aug 2, 2017 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, 2017 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, 2017 at 8:51
  • 4
    Does not work anymore, has Accuweather API changed?
    – Timo
    Dec 31, 2018 at 9:58
20

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

4
  • 5
    This is being publicly hosted now - with IP address to region mapping. Try: curl -4 wttr.in
    – jschrab
    Feb 24, 2016 at 21:56
  • 2
    @jschrab: And you don't need -4 actually. curl wttr.in is enough Feb 24, 2016 at 22:25
  • 1
    Metric units are also available on the publicly hosted version, like so: curl wttr.in/Helsinki?m
    – Ville
    Sep 30, 2019 at 20:13
  • If you need metric, don't forget to escape the question mark like this curl wrrt.in/Helsinki\?m or place the URL in single quotes like this curl 'wttr.in/Helsinki?m'
    – mchid
    Dec 22, 2020 at 2:22
15

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
7
  • 1
    Nice with weather forecast. +1 from me.
    – sourav c.
    Dec 15, 2013 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, 2016 at 22:12
  • I will update my answer
    – Raja G
    Dec 28, 2016 at 2:06
  • Replace YOUZIPORLOCATION with $1 if you want weather <location name> to work
    – Ed Neville
    Jan 17, 2018 at 20:23
  • 1
    I spoke too soon. The api is no longer free and there once was the option to apply for a free key for limited use but this is no longer the case.
    – mchid
    Dec 22, 2020 at 2:16
10

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

7

Another a program that comes pre-installed with Ubuntu called inxi will give you all types of stats on your computer as well as 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
2
  • 1
    Seems that inxi is not part of ubuntu, as of 10.04, but can be installed with sudo apt install inxi
    – Starbuck
    Nov 28, 2018 at 23:35
  • Yes, inxi is available but you need to enable the universe repository first.
    – mchid
    Mar 17, 2019 at 7:17
6

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

6
  • 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. Dec 13, 2013 at 17:13
  • Depending on your location that could be the current info that's available.
    – Mitch
    Dec 13, 2013 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, 2016 at 23:05
  • 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. Jan 31, 2017 at 3:08
  • 1
    Users outside of the US should read weather-utils description though: "[...] providing data for localities throughout the United States of America and some select locations globally [...]"
    – domsson
    Jan 13, 2018 at 16:09
5

Try using

telnet rainmaker.wunderground.com
2
4

Meteogram of all mayor cities in the world

finger [email protected]

$ finger [email protected]

           -= 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.]

Adding ~$(tput cols) automatically adapts the graph width to the number of columns available in the shell. The forecast will look further into the future on wide shells.

$ finger cologne~$(tput cols)@graph.no

Here is further information about how to use it:

$ finger [email protected]

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 [email protected] 

 Advanced usage:

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

 * finger ^<city name>@graph.no (Imperial units)
   Example: finger ^[email protected] 

 * finger <city name>[email protected] (forecast from 5 hrs ahead in time (max:26))
   Example: finger [email protected] 

 * finger <city name>[email protected] (set screen width)
   Example: finger [email protected] 

 * finger <city name>%[email protected] (forecast for every second hour [Norway])
   Example: finger oslo%[email protected] 

 * finger <post code>@graph.no (norwegian weather forecast)
   Example: finger [email protected] 

 Other: 

 * finger [email protected] (latest headlines from NRK)
 * finger [email protected] (server local time)
 * finger [email protected] (server local date)
 * finger [email protected] (contact information)

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

The story behind this from the developer.

3

If you are familiar with ICAO station names and METAR weather information from an airport.

sudo apt install metar

and check your preferable airport to get the data from https://www.world-airport-codes.com/ Example for Tokyo International airport/ Haneda = RJTT

metar -d rjtt

Sample output

RJTT 302000Z 34009KT 9999 FEW030 BKN050 14/08 Q1025 NOSIG  
Station       : RJTT  
Day           : 30  
Time          : 20:00 UTC  
Wind direction: 440 (NNE)  
Wind speed    : 9 KT  
Wind gust     : 9 KT  
Visibility    : 9999 M  
Temperature   : 14 C  
Dewpoint      : 8 C  
Pressure      : 1025 hPa  
Clouds        : FEW at 3000 ft  
                BRK at 5000 ft  
Phenomena     :  

Unlike weather command, this doesn't understand name of cities or countries. Instead of that feature, this can load quicker and multiple places at once.

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

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

3
  • bash: W: command not found
    – user389450
    Jan 16, 2017 at 4:37
  • After edit .bashrc relogin
    – sergkog
    Dec 14, 2017 at 20:38
  • 2
    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, 2019 at 3:59
2

For even shorter weather output openweathermap.org provides weather data in json format.

The filds from the JSON can then be obtained with a JSON parser like jq i.e..

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

☂ 6°C

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

An API-key is needed for openweathermap - you may send 1000 requests free of charge per day.

The JSON contains further fields, i.e. forecast data, wind etc. – you can parse them, too, if you want. A description of the API can be found at https://openweathermap.org/current#one .

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

Here's my script. Change location if you don't life in Hamburg,DE and replace dummy value with your API-key. Depends on curl and jq.

#!/usr/bin/env sh
#☁☂☔❄❅❆☃ ☀☁☂⚡⚐☼⛅☇☈☾

#settings - adjust
APIKEY="DUMMY"
LAT="53.618814544576594"
LON="10.131139271164836"
#build query url
QUERY="https://api.openweathermap.org/data/2.5/weather?lat="$LAT"&lon="$LON"&appid="$APIKEY"&units=metric"
# write json to variable
WEATHER_JSON=$(curl -Ls "$QUERY")
if [ $? -ne 0 ]
then
  exit 0
fi
# get fields from xml via xmllint | xargs for trimming
# weather description
WEATHER_TEXT=$(jq -r '.weather | .[0] | .description' - <<<"$WEATHER_JSON" | xargs);
WEATHER_ICON_CODE=$(jq -r '.weather | .[0] | .icon' - <<<"$WEATHER_JSON" | xargs);
# temperature
WEATHER_TEMPERATURE=$(jq -r '.main | .temp' - <<<"$WEATHER_JSON" | cut -d '.' -f 1 | xargs);

# set $WEATHER_SYMBOL according to $WEATHER_TEXT
if   [ "$WEATHER_ICON_CODE" == "01d" ]; then WEATHER_SYMBOL="☼"; elif [ "$WEATHER_ICON_CODE" == "01n" ]; then WEATHER_SYMBOL="☾";
elif [ "$WEATHER_ICON_CODE" == "02d" ]; then WEATHER_SYMBOL="⛅";elif [ "$WEATHER_ICON_CODE" == "02n" ]; then WEATHER_SYMBOL="☁";
elif [ "$WEATHER_ICON_CODE" == "03d" ]; then WEATHER_SYMBOL="☁"; elif [ "$WEATHER_ICON_CODE" == "03n" ]; then WEATHER_SYMBOL="☁";
elif [ "$WEATHER_ICON_CODE" == "04d" ]; then WEATHER_SYMBOL="☁"; elif [ "$WEATHER_ICON_CODE" == "04n" ]; then WEATHER_SYMBOL="☁";
elif [ "$WEATHER_ICON_CODE" == "09d" ]; then WEATHER_SYMBOL="☔"; elif [ "$WEATHER_ICON_CODE" == "09n" ]; then WEATHER_SYMBOL="☔";
elif [ "$WEATHER_ICON_CODE" == "10d" ]; then WEATHER_SYMBOL="☂"; elif [ "$WEATHER_ICON_CODE" == "10n" ]; then WEATHER_SYMBOL="☂";
elif [ "$WEATHER_ICON_CODE" == "11d" ]; then WEATHER_SYMBOL="⚡"; elif [ "$WEATHER_ICON_CODE" == "11n" ]; then WEATHER_SYMBOL="⚡";
elif [ "$WEATHER_ICON_CODE" == "13d" ]; then WEATHER_SYMBOL="❄"; elif [ "$WEATHER_ICON_CODE" == "13n" ]; then WEATHER_SYMBOL="❄";
elif [ "$WEATHER_ICON_CODE" == "50d" ]; then WEATHER_SYMBOL="⛆";elif [ "$WEATHER_ICON_CODE" == "50n" ]; then WEATHER_SYMBOL="⛆";
# if unknown icon, set text instead of symbol
else WEATHER_SYMBOL="$WEATHER_TEXT";
fi
# output <symbol><space><temp-in-°C>
echo "$WEATHER_SYMBOL"" ""$WEATHER_TEMPERATURE""°C";
exit 0;

EDIT 2022-07-09: Since tuxnet24.de does not provide weather anymore. I changed the provider to openweathermap. (this also involves json beeing parsed instead of xml in the former version) /EDIT

4
  • redirection unexpected error Feb 16, 2019 at 4:09
  • Switching shebang to #!/usr/bin/env bash fixed for me, Ubuntu 18.04 Feb 16, 2019 at 4:11
  • 1
    403 Forbidden error Jun 16, 2022 at 16:33
  • 2
    rewrote script to use non-404-service. thanks for pointing out, @SurpriseDog
    – kai-dj
    Jul 8, 2022 at 23:36
1

I've just made a quick endpoint that returns the weather, along with some more metrics:

curl https://curl-weather.herokuapp.com/

Note that it currently only displays the weather for London (UK). Here's the Github repo in case you'd like to clone or open issues: https://github.com/nkhil/weather-script

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

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .