Skip to main content Logo (IEC resistor symbol) logo

Quis custodiet ipsos custodes?
Home | About | All pages | RSS Feed | Gopher

Get a JSON value with bash and sed

Published: 26-02-2019 | Author: Remy van Elst | Text only version of this article

Table of Contents

Recently I was asked to get one value from a json object using only shell tools. The json in question is from a dutch radio station and it lists the current song that is played. Using this together with a few shell commands and notify- send we can show the current song when it changes as a desktop notification. I'd rather use Python or jq if it has to be shell. In this case the co-worker asked to just use simple shell tools and no external dependencies.

If you like this article, consider sponsoring me by trying out a Digital Ocean VPS. With this link you'll get $100 credit for 60 days). (referral link)

This is the json file, formatted:

# curl -s ''
        "PlayingNow":"Joke Buis - Welk Een Vriend Is Onze Jezus",

The field we want is the PlayingNow field. Using sed, a regular expression with a backreference (\1) it can be shown:

sed -n 's|.*"PlayingNow":"\([^"]*\)".*|\1|p'

Example output:

curl -s '' | sed -n 's|.*"PlayingNow":"\([^"]*\)".*|\1|p'

Joke Buis - Welk Een Vriend Is Onze Jezus

The full script to send the desktop notifications:

if [[ ! -f /tmp/gnr-prev.txt ]]; then touch /tmp/gnr-prev.txt; fi
PREVSONG="$(cat /tmp/gnr-prev.txt)"
curl -s '' | sed -n 's|.*"PlayingNow":"\([^"]*\)".*|\1|p' > /tmp/gnr-cur.txt
CURSONG="$(cat /tmp/gnr-cur.txt)"
if [[ "$PREVSONG" != "$CURSONG" ]]; then
    mv /tmp/gnr-prev.txt /tmp/gnr.$(date +%s).txt;
    mv /tmp/gnr-cur.txt /tmp/gnr-prev.txt;
    notify-send "GNR: $CURSONG";

Put it in cron for regular execution. Add this to your crontab as well if you use KDE:


Replace remy with your username.

Tags: bash , bash-bits , curl , json , python , sed , shell , snippets