Raymii.org
Quis custodiet ipsos custodes?Home | About | All pages | Cluster Status | RSS Feed
Get a JSON value with bash and sed
Published: 26-02-2019 | Author: Remy van Elst | Text only version of this article
❗ This post is over five years old. It may no longer be up to date. Opinions may have changed.
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.
Recently I removed all Google Ads from this site due to their invasive tracking, as well as Google Analytics. Please, if you found this content useful, consider a small donation using any of the options below. It means the world to me if you show your appreciation and you'll help pay the server costs:
GitHub Sponsorship
PCBWay referral link (You get $5, I get $20 after you've placed an order)
Digital Ocea referral link ($200 credit for 60 days. Spend $25 after your credit expires and I'll get $25!)
This is the json
file, formatted:
# curl -s 'https://api.grootnieuwsradio.nl/playing.json'
{
"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:\/\/api.streampartner.nl\/grootnieuws_ipad\/stream_information\/encoder_visitors_statistics",
"Options":[
"GET"
]
}
}
}
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 'https://api.grootnieuwsradio.nl/playing.json' | sed -n 's|.*"PlayingNow":"\([^"]*\)".*|\1|p'
Joke Buis - Welk Een Vriend Is Onze Jezus
The full script to send the desktop notifications:
#!/bin/bash
PATH="/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; fi
PREVSONG="$(cat /tmp/gnr-prev.txt)"
curl -s 'https://api.grootnieuwsradio.nl/playing.json' | 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";
fi
Put it in cron
for regular execution. Add this to your crontab as well if you
use KDE:
DISPLAY=:0.0
XAUTHORITY=/home/remy/.Xauthority
Replace remy
with your username.