Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
Extract a JSON value from a BASH script
#!/bin/bash
function jsonval {
temp=`echo $json | sed 's/\\\\\//\//g' | sed 's/[{}]//g' | awk -v k="text" '{n=split($0,a,","); for (i=1; i<=n; i++) print a[i]}' | sed 's/\"\:\"/\|/g' | sed 's/[\,]/ /g' | sed 's/\"//g' | grep -w $prop`
echo ${temp##*|}
}
json=`curl -s -X GET http://twitter.com/users/show/$1.json`
prop='profile_image_url'
picurl=`jsonval`
`curl -s -X GET $picurl -o $1.png`
@cjus

This comment has been minimized.

Copy link
Owner Author

commented Jun 26, 2011

A bash script which demonstrates parsing a JSON string to extract a property value. The script contains a jsonval function which operates on two variables, json and prop. When the script is passed the name of a twitter user it attempts to download the user's profile picture.

@dadicool

This comment has been minimized.

Copy link

commented Dec 2, 2011

Nice works like a charm!

@EthraZa

This comment has been minimized.

Copy link

commented Mar 22, 2013

Very nice. Thank you so much.

To return only the field value, just add " | cut -d":" -f2| sed -e 's/^ *//g' -e 's/ *$//g' " to the end of commands string:

function jsonval {
temp=echo $json | sed 's/\\\\\//\//g' | sed 's/[{}]//g' | awk -v k="text" '{n=split($0,a,","); for (i=1; i<=n; i++) print a[i]}' | sed 's/\"\:\"/\|/g' | sed 's/[\,]/ /g' | sed 's/\"//g' | grep -w $prop| cut -d":" -f2| sed -e 's/^ *//g' -e 's/ *$//g'
echo ${temp##*|}
}

@xaprb

This comment has been minimized.

Copy link

commented Jan 30, 2014

At a quick glance, looks like some things could be done a little more efficiently -- for example instead of starting up multiple sed processes, just use one and multiple -e arguments to it. And why is awk defined with a -v variable named k that is not used within the awk?

@saulovenancio

This comment has been minimized.

Copy link

commented Apr 28, 2014

tks guys,

@itstayyab

This comment has been minimized.

Copy link

commented Jun 20, 2014

It could far more Easy to do and read with less code as well.

Key for what you want to find

num occurrence of value if it multiple time

function jsonValue() {
KEY=$1
num=$2
awk -F"[,:}]" '{for(i=1;i<=NF;i++){if($i~/'$KEY'\042/){print $(i+1)}}}' | tr -d '"' | sed -n ${num}p
}

To print your values give second argument

curl -s -X GET http://twitter.com/users/show/$1.json | jsonValue profile_image_url 1

To print all values don't give second argument

curl -s -X GET http://twitter.com/users/show/$1.json | jsonValue profile_image_url

@itstayyab

This comment has been minimized.

Copy link

commented Jun 20, 2014

Another Example

function jsonValue() {
KEY=$1
num=$2
awk -F"[,:}]" '{for(i=1;i<=NF;i++){if($i~/'$KEY'\042/){print $(i+1)}}}' | tr -d '"' | sed -n ${num}p
}

URL Array to

urlArray=( "curl -s -X GET http://twitter.com/users/show/$1.json"
"curl -s -X GET http://twitter.com/users/show/$1.json"
"curl -s -X GET http://twitter.com/users/show/$1.json"
"curl -s -X GET http://twitter.com/users/show/$1.json")

Run below command with for loop

echo ${urlArray[$x]} | jsonValue profile_image_url 1
echo ${urlArray[$x]} | jsonValue profile_image_url 2

@jorgechen

This comment has been minimized.

Copy link

commented Jul 28, 2014

^ Thanks

@nirajkrz

This comment has been minimized.

Copy link

commented Aug 5, 2014

how to replace the value of a json node in a file?

@nathan-hoad

This comment has been minimized.

Copy link

commented Aug 8, 2014

Could you speak as how this is licensed? An important detail for those wanting to integrate this with existing code :)

@phillpafford

This comment has been minimized.

Copy link

commented Aug 23, 2014

Perfect, Thanks!

@anorsich

This comment has been minimized.

Copy link

commented Sep 3, 2014

Thank you!

@fatbattk

This comment has been minimized.

Copy link

commented Oct 3, 2014

Thanks for that simpler snippet @itstayyab!
I tweaked this line abit so it matches full quotes. So subtotal will not be matched when $KEY is total. But unfortunately it still suffers if a JSON value has same $KEY value or JSON contains any FS.

awk -F"[,:}]" '{for(i=1;i<=NF;i++){if($i~/\042'$KEY'\042/){print $(i+1)}}}' | tr -d '"' | sed -n ${num}p
@Jaykah

This comment has been minimized.

Copy link

commented Dec 4, 2014

Awesome, thanks!

@vasilemihali

This comment has been minimized.

Copy link

commented Feb 26, 2015

Great, thanks!!!

@bk138

This comment has been minimized.

Copy link

commented Mar 14, 2015

+1 with the kudos!

@bcopos

This comment has been minimized.

Copy link

commented Jul 31, 2015

I think sed grouping could also be used, something like:

echo $json | sed 's/{.*$key":"*\([0-9a-zA-Z]*\)"*,*.*}/\1/'

And you can probably tweak it so the grouping regex is just .* instead of [0-9a-zA-Z]*

@evandrix

This comment has been minimized.

Copy link

commented Aug 6, 2015

@ilovefood2

This comment has been minimized.

Copy link

commented Aug 26, 2015

hello,

i tried but it only return one instance value, my json file has multiple values under same prop names (play_url)
how can i print all of them?

thanks

@boomshadow

This comment has been minimized.

Copy link

commented Aug 31, 2015

I found this Github project incredibly useful for JSON parsing:
https://github.com/trentm/json

@jfig

This comment has been minimized.

Copy link

commented Jan 12, 2016

Thanks for this, saved my day ;)

@xianlin

This comment has been minimized.

Copy link

commented Jan 23, 2016

I have the same issue as @ikelca mentioned, any solutions by using this script?

@behelit

This comment has been minimized.

Copy link

commented Apr 28, 2016

none of these solutions work for a json response that includes a URL (i.e: https://some.url")

{"response":{"code":"200","message":"OK"},"item":"https://someurl.com/api/"}

@pmckelvy1

This comment has been minimized.

Copy link

commented Apr 28, 2016

works great, thanks

@chenqiangzhishen

This comment has been minimized.

Copy link

commented Jul 20, 2016

great, thx.

@ggupta01

This comment has been minimized.

Copy link

commented Apr 28, 2017

Hi,

if i have a json file or json string, and then i need to extract all the key from it, then what changes i need to do?

thanks in advance.

@ORESoftware

This comment has been minimized.

Copy link

commented Nov 11, 2017

gnar gnar

@otherpirate

This comment has been minimized.

Copy link

commented Feb 6, 2018

Genius, thanks

@EricW1970

This comment has been minimized.

Copy link

commented Apr 10, 2018

Great tips and examples, saved the evening :)... Thanks!

@amedee

This comment has been minimized.

Copy link

commented Apr 27, 2018

Or just use jq...

@frazras

This comment has been minimized.

Copy link

commented May 6, 2018

jq is that bomb

@i3laze

This comment has been minimized.

Copy link

commented May 10, 2018

@itstayyab,
Your function jsonValue() works pretty great, but only in Bash! Cause For is not supported in Shell.
Could you please rewrite it with a While loop?

@psmanek

This comment has been minimized.

Copy link

commented Aug 4, 2018

Small modification to display only one result for our $KEY.

awk -F"[,:}]" '{for(i=1;i<=NF;i++){if($i~/\042'$KEY'\042/){print $(i+1)}}}' | tr -d '"' | sed -e 's/^[[:space:]]*//'

But... How to display whole result if it contains "," or ":" character?

@joshimanish1986

This comment has been minimized.

Copy link

commented Oct 11, 2018

@psmanek. I am facing similar issue. my value string contains , and =. Please let me know if you or anyone on this thread were able to resolve this.

@alxlaxv

This comment has been minimized.

Copy link

commented Oct 17, 2018

If my json contains a list of object, how can I extract 2 properties of each object?
Want to use one depending of the second one for each object.
Thanks!

@rkewlani

This comment has been minimized.

Copy link

commented Nov 26, 2018

nice. works very well.

@wshbair

This comment has been minimized.

Copy link

commented Mar 11, 2019

Great it works very well with adding --silent option in curl

@flinox

This comment has been minimized.

Copy link

commented Apr 3, 2019

it works! tkz, great job!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.