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 currentsong 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-workerasked to just use simple shell tools and no external dependencies.

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

This is the json file, formatted:

# curl -s ''{    "Stream_information":{        "Name":"grootnieuws_ipad",        "NameByClient":"grootnieuwsradio_website_aac",        "Limit":"2000",        "Account":"calculation",        "IncomingSignal":"offline",        "SecureTokenSharedSecret":"",        "SecureTokenQueryParametersPrefix":"",        "SecureTokenIncludeClientIPInHash":"false",        "MultiBitrateEnable":"false",        "DVREnable":"false",        "PlayIPWhiteList":"",        "PublishIPWhitelist":"",        "SimultaneousConnections":"1729",        "Auto_recording":"off",        "PlayingNow":"Joke Buis - Welk Een Vriend Is Onze Jezus",        "Encoder_visitors_statistics":{            "REST_URI":"https:\/\/\/grootnieuws_ipad\/stream_information\/encoder_visitors_statistics",            "Options":[                "GET"            ]        }    }}

The field we want is the PlayingNow field. Using sed, a regular expressionwith 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:

#!/bin/bashPATH="/usr/local/bin:/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin:/usr/local/sbin:$PATH"if [[ ! -f /tmp/gnr-prev.txt ]]; then touch /tmp/gnr-prev.txt; fiPREVSONG="$(cat /tmp/gnr-prev.txt)"curl -s '' | sed -n 's|.*"PlayingNow":"\([^"]*\)".*|\1|p' > /tmp/gnr-cur.txtCURSONG="$(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";fi

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


Replace remy with your username.

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